关于volatile为什么不能保证原子性详解

一、前提

大家如果不理解volatile这个关键字可以去看我的这篇文章:Java volatile关键字详解_向上的狼的博客-CSDN博客_java的volatile关键字

二、volatile不能保证原子性分析

看了好几篇关于volatile保证可见性但是为什么不能保证原子性的文章,感觉解释都不怎么到位,个人理解如下:

举例: inc++

分析: 是三步操作,涉及到:读 计算 写

线程1:

读到 inc=0进高速缓存,计算后inc=1,然后阻塞了 此时线程执行完了读和计算操作,就差写操作没有执行了,
(此时主存inc=0,线程1缓存inc=1)

然后线程2执行

线程2:
读到 inc=0进高速缓存,计算后inc=1,把1写入主存,因为使用了volatile关键字的原因,会把线程1高速缓存中的inc标记为失效,线程2执行完毕。
(此时主存inc=1,线程1缓存inc=1)

当线程1在获得执行权的时候,现在就只差写操作了,它会从自己缓存了取到inc的数据,但是自己缓存里面的inc标记了失效,这会触发它会从主存再次加载inc=1 这个数据,然后继续执行自己还没有执行完的写操作,把inc=1写道主存(虽然线程1知道数据已经失效,但是读和计算的操作是已经执行过了的命令,所以它不会重新计算了,它只差写操作的命令)。

所以volatile只能保证变量的可见性,不能保证原子性.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值