lujin55 2012-03-15 17:48
浏览 372
已采纳

volatile可见性

我在学习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。

不知道我突然想出的步骤是不是正确的,希望大家指导。

  • 写回答

5条回答 默认 最新

  • suziwen 2012-03-15 18:25
    关注

    你自己回答到了

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。
  • ¥15 抖音看过的视频,缓存在哪个文件