为了账号安全,请及时绑定邮箱和手机立即绑定

这里为什么number的值改变了,线程A不会把主内存的值刷新到线程A中呢?跟前面讲的变量可见性不矛盾了吗?

这里为什么number的值改变了,线程A不会把主内存的值刷新到线程A中呢?跟前面讲的变量可见性不矛盾了吗?

正在回答

6 回答

你看看这样能不能理解:number的值可以存在三个地方:主内存,cpu缓存,cpu寄存器。因为加上了volatile关键字,cpu每次对number的读取都强迫cpu缓存从主内存中读取。但是count++操作有三步,读count,计算count+1,将计算的结果给count。假设读count已经执行了,number已经放到了cpu寄存器中。此时当执行权被其他线程抢走之后再次轮到当前线程执行的时候,已经不需要再读number了。故number还是没有变化

0 回复 有任何疑惑可以回复我~
#1

慕工程4835570 提问者

就是说如果cpu缓存里已经读取了number的值,则不在重新读了。volatile强迫cpu对number读值只是在cpu缓存中还没有值的时候?
2019-01-17 回复 有任何疑惑可以回复我~

读之前肯定是需要从主内存中读,但是A已经读取完了,就不必再去主内存中读

0 回复 有任何疑惑可以回复我~

是在读取前刷新工作内存,从主内存中取值,现在已经读取完了,就只操作工作内存了

0 回复 有任何疑惑可以回复我~

不是很好理解嘛,A第一步是先读取number的,因为不是原子性,后面操作的 +1和写入主内存得最新值都没有刷到A的工作内存中啊,别搞混了兄弟

0 回复 有任何疑惑可以回复我~

b线程执行之后,主内存中number加1.假设轮到a线程执行,此时,a线程的工作内存和执行栈中number都是原来的值,但是它的执行栈中已经有该变量的值了,所以直接用了不去检查其工作内存中该变量的值是否需要刷新。所以用的是原来的值,这种情况存在。

0 回复 有任何疑惑可以回复我~

可见性和原子性并没有关系,volatile能保证可见性,却无法保证原子性,因而线程会被干扰

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

这里为什么number的值改变了,线程A不会把主内存的值刷新到线程A中呢?跟前面讲的变量可见性不矛盾了吗?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信