LongAdder
来源:3-2 线程安全性-原子性-atomic-2
![](http://img1.sycdn.imooc.com/user/57bfed810001314d01000100-100-100.jpg)
qq_李永强_03881041
2018-05-04
老师我想问一下,LongAdder是通过把Value拆分,把单节点的压力分散到多节点,这么看来是不是和ConcurrentHashMap的想法上差不多,但是ConcurrentHashMap里面的各个数据没有关系,而LongAdder对象拆分后,比如64位拆分为两个32位去操作,但是这两个32位的元素之间是有关联的,那么LongAdder中是怎么保证这两个元素的操作不会出现一个操作成功,而另一个操作出现问题从而导致最后得出的结果是错误的这种现象呢,也就一个value进行分段更新时是如何保证,这些有联系的段都能正确执行,导致最后结果不会出错
写回答
1回答
-
Jimin
2018-05-04
你好,关于LongAdder,推荐一篇讲的不错的文章,https://github.com/aCoder2013/blog/issues/22 ,这里介绍了@sun.misc.Contended 以防cells数组发生伪共享的情况
关于64位拆分为两个32位去操作,这个网上很多资料都有介绍,具体为:在一些 32 位的处理器上,如果要求对 64 位数据的写操作具有原子性,会有比较大的开销。为了照顾这种处理器,Java 语言规范鼓励但不强求 JVM 对 64 位的 long 型变量和 double 型变量的写具有原子性。当 JVM 在这种处理器上运行时,会把一个 64 位 long/ double 型变量的写操作拆分为两个 32 位的写操作来执行。这两个 32 位的写操作可能会被分配到不同的总线事务中执行,此时对这个 64 位变量的写将不具有原子性。
00
相似问题