问题在讨论原子性操作时,我们经常会听到一个说法:任意单个volatile变量的读写具有原子性,但是volatile++这种操作除外。答案因为它实际上是三个操作组成的一个符合操作。分析结合内存屏障这个概念对volatile的读写操作深入理解的话:在第一步操作的指令后,会增加两个内存屏障:。因此第一个指令和它后续的普通读写操作会被保证没有重排序来捣乱。虽然它需要耗费一定的CPU Cycle,但是相比锁而言还是有其优势,比如它能够避免线程阻塞引起的上下文切换和调度。这两类操作的量级明显是不一样的,CAS更轻量一些。总结我们说对于volatile变量的读/写操作是原子性的。由于其中掺杂了一个自增的CPU内部操作,就造成这个复合操作不再保有原子性。

为什么Java volatile++不是原子性的详解

为什么Java volatile++不是原子性的详解

为什么Java volatile++不是原子性的详解