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

在JDK8中新增了一个LongAdder类 , 其采用分而治之的策略来减少同一个变量的并发竞争度LongAdder的核心思想是把一个原子变量分解为多个变量 , 让同样多的线程去竞争多个资源 , 这样竞争每个资源的线程数就被分担了下来 , 下面通过图形来理解下两者设计的不同之处:如上图AtomicLong是多个线程同时竞争同一个原子变量 。

如上图LongAdder内部维护多个Cell变量 , 在同等并发量的情况下 , 争夺单个变量更新操作的线程量会减少 , 这是变相的减少了争夺共享资源的并发量 。

下面我们首先看下Cell的结构:

LongAdder维护了一个延迟初始化的原子性更新数组(默认情况下Cell数组是null)和一个基值变量base , 由于Cells占用内存是相对比较大的 , 所以一开始并不创建 , 而是在需要时候在创建 , 也就是惰性 创建 。

当一开始判断cell数组是null并且并发线程较少时候所有的累加操作都是对base变量进行的 , 这时候就退化为了AtomicLong 。 cell数组的大小保持是2的N次方大小 , 初始化时候Cell数组的中Cell的元素个数为2 , 数组里面的变量实体是Cell类型 。

推荐阅读