Longadder与Atomiclong相似,但是Longadder在多线程更新下具有更高的性能。Longadder更适合统计方案,例如监视统计,计数统计信息等。例如,如果我们想实现单词计数器,我们可以实现通过以下代码:
Longadder类从Strifed64类继承。Longadder类中没有字段,并且状态存储在条纹64中。Longadder封装了两种方法:add and sum方法。添加方法负责修改计数和总和读数计数。
条纹64采用了一种思想来提高并发性。其中,保留了一个长型基场和一个单元格数组。每个单元格也都有一个值字段。当没有冲突时,它将通过CAS基地进行更新。发生冲突时,将更新单元格数组。当更新单元格数组时,将扩展单元阵列以减少冲突。
Longadder的添加更新逻辑是
然后查看条纹64类,首先定义一个单元格类,然后使用@Contended注释来标记假共享的问题。在单元格中,有一个值字段代表当前单元格的值。所有单元格和基础均汇总到达最终值。单元类还提供了一种CAS方法,该方法是通过VARHANDLE类实现的。此类似版本的不安全函数。然后在Stripe64类别中定义了单元格数,基本变量和cellbusy spin -lock字段。单元格数组用于在每个零件中存储该值。当有存在时,将使用base变量没有线程竞争以减少记忆职业。当线程从0更改为1到CAS时,它表明线程获取锁定。
条纹64的核心方法是漫长的。它将尝试找到与当前线程相对应的单元格,并完成单元阵列初始化的逻辑,单元对象的初始化,容量扩展,调整探针值以在需要时解决冲突。
原子和隆德的选择
作者:Bytejava