视频17:00的volatile问题

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

慕UI3469488

2019-05-15

图片描述按老师所说的,线程1读取了主内存的volatile变量,但是还没写回去,线程2也读到此时volatile变量的域值,两个线程看到的值是一样,最后两个线程刷新回去总有个先后,那是不是意味着后一个线程工作内存的变量就失效了,此时就不能写回去主内存中,而要重新读最新的volatile变量,这样岂不是变成线程安全了?不知道自己哪里理解错了,求老师点明我一下,好纠结

写回答

1回答

翔仔

2019-05-15

同学好,volatile没办法约束两个线程的先后执行顺序,只能保证线程内部执行的时候,对volatile变量的操作顺序是固定的,具体可以看看

https://www.itcodemonkey.com/article/1725.html

理解内存屏障后,再来看看这个例子

如果有一个变量i = 0用volatile修饰,两个线程对其进行i++操作,如果线程1从内存中读取i=0进了缓存,然后把数据读入寄存器,之后时间片用完了,然后线程2也从内存中读取i进缓存,因为线程1还未执行写操作,内存屏障是插入在写操作之后的指令,意味着还未触发这个指令,所以缓存行是不会失效的。然后线程2执行完毕,内存中i=1,然后线程1又开始执行,然后将数据写回缓存再写回内存,结果还是1。

因此没办法保证线程安全

0
1
慕UI3469488
明白了,非常感谢老师的解答!
2019-05-16
共1条回复

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

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

8427 学习 · 1870 问题

查看课程