关于volatie关键字的问题

来源:9-5 jmm的内存可见性

Eric_Guoyh

2019-01-31

老师您说了如果多个线程使用共享变量,该变量使用volatile的时候,一个线程改变变量的值会使得其他线程的工作内存缓存被设置为无效状态,其他线程会去主存中读取该变量从而达到可见性。但是如果第一个线程改变的变量还没来得及写到主存其他线程就读取主存了,那结果不还是其他线程读取的不是最新的变量值吗?

写回答

2回答

慕工程6478377

2019-02-14

结论:

不存在一个线程正在改写共享变量,但是没有改写完成,其他线程这时候去读取的时候读取到旧值的情况

原因:

你说的这个情况貌似是底层cpu自己保证的,violate还是利用的是缓存一致性 + 内存屏障来实现的,当一个线程改写共享变量的时候,会发布消息让其他cpu的该变量的缓存变为无效,让后再去改写,不存在当前线程没有改写完成,其他线程就可以读取该共享变量的值的情况,这种改写的操作在底层的实现上(从汇编来看),其指令请前都会有一个lock前缀,在没有改写完成之前,其他线程无法读取该共享变量

以上是我的看法

0
0

翔仔

2019-01-31

同学好,所以这就是线程里涉及到检测变量的时候 多用循环反复验证的原因,除非加锁,没办法避免线程没来得及改数据其他线程读取的问题。但是当其他线程正在用这个变量的时候,第一个线程完成了修改,此时其他线程工作内存里的变量就会失效,再读取就是最新修改的值,所以建议循环读取做判断

0
2
翔仔
回复
ZoeC5
同学好,这个当时没仔细看以为是CAS相关了,volatile的变量不需要自己判断,是jvm的机制来保证内存的可见性的,带来不便,深感抱歉,当时还在赶课程没休息好 :)
2019-09-04
共2条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程