参考博文: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指令的它是原子性的操作。在写入时会比较内存中的真实值和期望值是否是一致的,如果一致则更新成功。如果不是,则将内存中的值取出,再进行上面的操作。