LongAdder基础

  LongAdder是JDK8中并发包中的一个新类,和AtomicLong都使用CAS,但是性能比AtomicLong更好。

  LongAdder在AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的减小锁粒度,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。

  

  AtomicLong通过CAS 指令从机器指令级别操作保证并发的原子性,但在高并发时CAS的失败几率更高, 重试次数更多,越多线程重试,CAS失败几率又越高,变成恶性循环,AtomicLong效率降低。

  而LongAdder有点类似ConcurrentHashMap,将把一个value拆分成若干cell,把所有cell加起来,就是value。

  对LongAdder进行加减操作,只需要对不同的cell来操作,不同的线程对不同的cell进行CAS操作,CAS的成功率当然高了(试想一下3+2+1=6,一个线程3+1,另一个线程2+1,最后3个数字的结果是8,LongAdder没有乘法除法的API)。

 

  可是在并发数不是很高的情况,拆分成若干的cell,还需要维护cell和求和,效率不如AtomicLong的实现。LongAdder用了巧妙的办法来解决了这个问题。

  初始情况,LongAdder与AtomicLong是相同的,只有在CAS失败时,才会将value拆分成cell,每失败一次,都会增加cell的数量,这样在低并发时,同样高效,在高并发时,这种“自适应”的处理方式,达到一定cell数量后,CAS将不会失败,效率大大提高。

  但JDK8并没有所谓的IntegerAdder,只增加了LongAdder和DoubleAdder

posted on 2016-02-23 22:08  lnlvinso  阅读(1670)  评论(0编辑  收藏  举报