longAdder
来源:3-2 线程安全性-原子性-atomic-2
![](http://img1.sycdn.imooc.com/user/55e57c0400014a4310241024-100-100.jpg)
红邮筒
2018-12-31
以前问的问题没有回答,下面是整个问题描述,麻烦老师看一下
写回答
1回答
-
感觉这篇文章你没看完啊,代码里判断cpu那里,紧接着就是“重新计算hash(异或)从而尝试找到下一个空的slot”,在总结里也写着“数组访问索引是通过Thread里的threadLocalRandomProbe域取模实现的,这个域是ThreadLocalRandom更新的,cells的数组大小被限制为CPU的核数,因为即使有超过核数个线程去更新,但是每个线程也只会和一个CPU绑定,更新的时候顶多会有cpu核数个线程,因此我们只需要通过hash将不同线程的更新行为离散到不同的slot即可。”
从你的问题里,我隐约感觉你好像没抓住核心,这里cpu本身不是关键,因为实际中虽然会有很多并发的场景,而同时操作同一个点的线程会少很多,因为业务逻辑基本会限制某个数据被同时更新的次数
关于这个类的核心这篇文章也总结到了:在无竞争的情况下直接更新base域,在第一次发生竞争的时候(CAS失败)就会创建一个大小为2的cells数组,每次扩容都是加倍。这是核心的原理,其他操作都是围绕这个原理做些优化及细节处理。012019-01-02
相似问题