LongAdder和AtomicLong的区别

AtomicLong的原理是依靠底层的cas来保障原子性的更新数据,在要添加或者减少的时候,会使用自循(CLH)方式不断地cas到特定的值,从而达到更新数据的目的。然而在线程竞争激烈的情况下,自循往往浪费很多计算资源才能达成预期效果。

 

面对自循的缺点,jdk1.8推出了LongAdder类,他的实现方式有点像ConcurrentHashMap一样,采用空间换时间的方式,提高在线程竞争激烈的情况下,提供计数的效率,接下来我们看看源码是怎么实现的。线程数越多,并发操作数越大,LongAdder的优势逐渐体现出来

 

看源码前,我们先明白源码做了些什么,这样有目的的看,往往事半功倍。

 

LongAdder内里面存在一个Cell数组,计数是将线程id进行hash算法后,得到一个小于等于当前计算机核数的值,根据该值定位到一个cell数组,然后操作该cell进行单独计数。最终求总计数值时候,把所有的cell数组值相加即可。这样将多个线程操作一个AtomicLong转变为多个线程操作多个cell的情况,自然竞争小了,效率高了。可是存储空间大了。

你可能感兴趣的:(多线程)