如何手写线程池

参考博文:https://www.cnblogs.com/tong-yuan/p/11639269.html

把握几个细节点的概念?

1. 阻塞队列选取:使用LinkedBlockingQueue,作为阻塞队列

2. 向丢列中添加任务时使用offer方法,不要使用add方法。

3. 线程创建成功后会以自旋的方式不断的取任务执行,用while循环的方式实现。

LinkedBlockingQueue是如何实现线程安全的?add,offer,put有什么不同?

offer: 使用了reentrantLock,对添加节点的逻辑进行加锁,在finally中使用unlock进行解锁。

add:   底层使用的就是offer, 只是在添加不成功的时候主动抛出异常。

put: 使用的lock.lockInterruptibly的方式进行的加锁,该方式实现了等待可中断的特性。线程拿不到锁资源时,会处于等待状态,其他线程可以调用interrupt方法中断它。

AtomicInteger的实现原理?

volatile 字 修饰变量value 使赋值操作是对所有的线程可见的

unsafe包,使用CAS原理,完成写的操作,CAS是对应一个CUP指令的它是原子性的操作。在写入时会比较内存中的真实值和期望值是否是一致的,如果一致则更新成功。如果不是,则将内存中的值取出,再进行上面的操作。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值