volatile 关键字 详解,为何不能保证复合操作的原子性

一直对volatile 有些许的疑惑,就是它既然实时刷新主内存中的值,并且能保证可见,为啥不能保证原子性n,下面分析

使用volatile 关键字修饰共享变量时,变量就会有以下特点:

1、变量对其他线程具有可见性。

2、禁止进行指令重排,保证了有序性。

3、保证单操作原子性,对任意单个volatile变量的读写具有原子性,但对于复合操作不保证原子性,如x++。

两个线程同时操作x共享变量,首先a,b线程的本地内存中都读到了主内存中的x=0,当a线程对x变量修改时,其值会立即刷回主内存,b线程中的x也会同时读到最新的值。但是当a,b线程同对x进行++操作时就不能保证原子性了。

当执行x++,其实是执行了三步操作

1.从主内存读取值x=0;

2.执行x=0+1;

3.再把x=1刷回主内存;

当a,b同时操作x共享变量时,都执行到第一步,同时读取了x的值为0,此时a变量率先执行完到第2步第3步,x的值为1刷回到主内存了,但b线程已经执行到第2步了,即使x此时的值为1,b线程执行第2步的操作时是x=0+1.而不是x=x+1,所以最后结果还是1,这就是为什么复合操作不能保证原子性的原因。

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值