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

来源:4-3 volatile不能保证原子性(中)

慕工程4835570

2018-08-10 10:51

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

写回答 关注

6回答

  • 自有如风
    2018-10-22 11:50:01
    已采纳

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

    慕工程483...

    就是说如果cpu缓存里已经读取了number的值,则不在重新读了。volatile强迫cpu对number读值只是在cpu缓存中还没有值的时候?

    2019-01-17 10:07:37

    共 1 条回复 >

  • 斌哥在此
    2020-12-01 13:40:01

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

  • iceWang
    2019-01-22 10:46:19

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

  • jasamha
    2018-11-17 01:04:24

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

  • 慕前端6229441
    2018-09-17 08:36:25

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

  • 难为水
    2018-08-25 19:04:36

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

细说Java多线程之内存可见性

用两种方式实现内存可见性,代领大家深层次学习Java中的内存

55910 学习 · 74 问题

查看课程

相似问题