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

volatile可见性

volatile可见性

大话西游666 2019-03-14 14:15:09
我在学习volatile的时候,知道它的作用是保证线程的可见性,意思是说当共享变量发生改变时,其它线程可以见。但我不明白其它线程可见是什么意思?例如共享变量x=0加了volatile这个关键字; A,B两个线程A读到x=0;B也读到x=0;A做了加一操作,此时x=1。那么B线程也应该知道x=1;可是B做加一操作时,x也等于1。那么我想知道这个B线程知道了x已经改变是什么意思?最好有个volatile例子能说明下。我突然想到是这个可能:因为x=x+1不是原子操作,分二个步骤,加操作和赋值操作。当B的加操作比A线程快一步,但B的赋值操作比A线程慢一步时B已经用0做完了加操作得到的结果是1,但是没赋值给x。A已经做完了加操作,x值此时已经更新到主内存中。按照可见性,B重新读取x=1。此时B线程内x=1,是从主内存中更新的。再做赋值操作把B线程做的加操作结果赋值给x,x=1。所以出现2个1。不知道我突然想出的步骤是不是正确的,希望大家指导。
查看完整描述

4 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

你自己回答到了

x=x+1确实不是原子操作所以可能出现两个1

x++,++x等都不是原子操作


查看完整回答
反对 回复 2019-04-26
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

A做了加一操作,此时x=1。那么B线程也应该知道x=1;

B知道是有时间间隔的,因为线程间的内存需要先同步到主内存,再同步到其他各个线程的内存上的,这些操作虽然很快,但在多线程下还是有时间 间隔的


查看完整回答
反对 回复 2019-04-26
  • 4 回答
  • 0 关注
  • 526 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号