zigBee2014 2017-10-06 02:51 采纳率: 0%
浏览 1060
已结题

对volatile不能保证原子性的例子的疑问

讲volatile不能保证原子性时会举这么个例子

假如某个时刻变量inc的值为10,

线程1对变量进行自增操作,线程1先读取了变量inc的原始值,然后线程1被阻塞了;

然后线程2对变量进行自增操作,线程2也去读取变量inc的原始值,由于线程1只是对变量inc进行读取操作,而没有对变量进行修改操作,所以不会导致线程2的工作内存中缓存变量inc的缓存行无效,所以线程2会直接去主存读取inc的值,发现inc的值时10,然后进行加1操作,并把11写入工作内存,最后写入主存。

然后线程1接着进行加1操作,由于已经读取了inc的值,注意此时在线程1的工作内存中inc的值仍然为10,所以线程1对inc进行加1操作后inc的值为11,然后将11写入工作内存,最后写入主存。

那么两个线程分别进行了一次自增操作后,inc只增加了1。


我的疑问在于:
线程2对变量+1写入主存后,线程1的inc缓存不是会变成无效么,这个时候线程1难道不会重新从主内存读取inc的值?

  • 写回答

4条回答 默认 最新

  • 999级 2017-10-06 04:47
    关注

    前程1每次,取valitate修饰的变量都会到主存中去取值。此时线程2执行inc++时,分为几个步骤。从主存中获取值,然后+1,再将结果写回主存。如果在线程2从
    主存中,获取值后。下一步CPU使用权到了线程1手上,线程1从主存取值,取到的值还是10。此时,由于取到了值,当线程2将值修改为11时。线程1将不会去
    主存中,去取值。

    valitate只能保证线程每次取变量,都会从主存中获取。不能保证每次获取的值,是最新修改的值。

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘