JUC包中的分而治之策略-为提高性能而生( 四 )

其中unsafe.getAndAddLong的代码如下:

可知最终调用的是native 方法compareAndSwapLong原子性操作 。

当多个线程调用同一个AtomicLong实例的incrementAndGet方法后 , 多个线程都会执行到unsafe.getAndAddLong方法 , 然后多个线程都会执行到代码(1)处获取计数器的值 , 然后都会去执行代码(2) , 如果多个线程同时执行了代码(2) , 由于CAS具有原子性 , 所以只有一个线程会更新成功 , 然后返回true从而退出循环 , 整个更新操作就OK了 。 其他线程则CAS失败返回false , 则循环一次在次从(1)处获取当前计数器的值 , 然后在尝试执行(2) , 这叫做CAS的自旋操作 , 本质是使用Cpu 资源换取使用锁带来的上下文切换等开销 。

2.2 LongAdder类

AtomicLong类为开发人员使用线程安全的计数器提供了方便 , 但是AtomicLong在高并发下存在一些问题 , 如上所述 , 当大量线程调用同一个AtomicLong的实例的方法时候 , 同时只有一个线程会CAS计数器的值成功 , 失败的线程则会原地占用cpu进行自旋转重试 , 这回造成大量线程白白浪费cpu原地自旋转 。

推荐阅读