Java volatile关键字

参考:https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

  “原子操作”的概念就不多解释了,在java中,除了longdouble型变量的其他基本类型的变量的读写都是原子的。volatile关键字的变量的读写操作都是原子的(即使变量是longdouble)。原子操作之间是不能有交叠的。所以进行原子操作时不需要担心多线程产生的冲突,但是这并不能消除同步原子操作的需要,因为内存一致性错误(当不同的线程对于同一个数据有不一致的值时,产生内存一致性错误),还是可能发生。

  使用volatile能够减少内存一致性错误,因为任何对volatile变量的写操作都建立在与相同变量的一系列读操作的happens-before关系上。这就意味着对volatile变量的任何改变永远对其它线程是可见的。进一步讲,当一个线程读一个volatile变量值,永远都是读到最新的。

  使用volatile关键字比通过synchronized代码段更加的高效,属于轻量级的线程同步机制,但是需要程序员更多关注一下避免内存一致性错误


  总结一下,volatile关键字能够保证对变量读写操作的原子性,还能满足可见性也就是保证变量读写操作的happens-before关系。