关于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只能保证变量的可见性,不能保证原子性.

猜你喜欢

转载自blog.csdn.net/m0_50370837/article/details/126753186