慕工程4835570
2018-08-10 10:51
这里为什么number的值改变了,线程A不会把主内存的值刷新到线程A中呢?跟前面讲的变量可见性不矛盾了吗?
你看看这样能不能理解:number的值可以存在三个地方:主内存,cpu缓存,cpu寄存器。因为加上了volatile关键字,cpu每次对number的读取都强迫cpu缓存从主内存中读取。但是count++操作有三步,读count,计算count+1,将计算的结果给count。假设读count已经执行了,number已经放到了cpu寄存器中。此时当执行权被其他线程抢走之后再次轮到当前线程执行的时候,已经不需要再读number了。故number还是没有变化
读之前肯定是需要从主内存中读,但是A已经读取完了,就不必再去主内存中读
是在读取前刷新工作内存,从主内存中取值,现在已经读取完了,就只操作工作内存了
不是很好理解嘛,A第一步是先读取number的,因为不是原子性,后面操作的 +1和写入主内存得最新值都没有刷到A的工作内存中啊,别搞混了兄弟
b线程执行之后,主内存中number加1.假设轮到a线程执行,此时,a线程的工作内存和执行栈中number都是原来的值,但是它的执行栈中已经有该变量的值了,所以直接用了不去检查其工作内存中该变量的值是否需要刷新。所以用的是原来的值,这种情况存在。
可见性和原子性并没有关系,volatile能保证可见性,却无法保证原子性,因而线程会被干扰
细说Java多线程之内存可见性
55908 学习 · 74 问题
相似问题