《java并发编程之美》第四章(主打一个陪伴学习)

JDK8新增的原子操作类LongAdder

前面的AtomicLong采用非阻塞CAS算法来实现,虽然相对于阻塞算法,性能提高了不少,但是呢,还是存在问题。在高并发的情况下,多个线程去竞争同一个原子性变量,必定会出现很多线程竞争失败,不断自旋,导致cpu空转。未来解决这个问题,LongAdder应用而生。

前面可以看到,它的主要问题是竞争单个原子性变量,导致的竞争失败。那在LongAdder中采用的是,在内部维护多个Cell变量,初始值是Long型的0。这样子,在同样的并发两的情况下,去竞争单个cell的并发量会减少,并且当当前的cell竞争失败的时候,不是在当前的cell上继续做CAS尝试,而是在其它的cell上进行尝试。在最后LongAdder获取值的时候,是将所有的cell变量的value相加再加上base返回。当一开始判断cell数组为null,并且并发线程数较少时,会直接对base变量进行操作,而不是初始话cell数组。而初始cell数组的时候,会保证cell变量的个数是2的N次方。

全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务