longAdder

来源:3-2 线程安全性-原子性-atomic-2

红邮筒

2018-12-31

以前问的问题没有回答,下面是整个问题描述,麻烦老师看一下
图片描述
图片描述

写回答

1回答

Jimin

2018-12-31

感觉这篇文章你没看完啊,代码里判断cpu那里,紧接着就是“重新计算hash(异或)从而尝试找到下一个空的slot”,在总结里也写着“数组访问索引是通过Thread里的threadLocalRandomProbe域取模实现的,这个域是ThreadLocalRandom更新的,cells的数组大小被限制为CPU的核数,因为即使有超过核数个线程去更新,但是每个线程也只会和一个CPU绑定,更新的时候顶多会有cpu核数个线程,因此我们只需要通过hash将不同线程的更新行为离散到不同的slot即可。”
从你的问题里,我隐约感觉你好像没抓住核心,这里cpu本身不是关键,因为实际中虽然会有很多并发的场景,而同时操作同一个点的线程会少很多,因为业务逻辑基本会限制某个数据被同时更新的次数
关于这个类的核心这篇文章也总结到了:在无竞争的情况下直接更新base域,在第一次发生竞争的时候(CAS失败)就会创建一个大小为2的cells数组,每次扩容都是加倍。这是核心的原理,其他操作都是围绕这个原理做些优化及细节处理。

0
1
红邮筒
非常感谢!
2019-01-02
共1条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程