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

经验分享 程序员 微信小程序 职场和发展