关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、完整地理解,所以很多程序员都习惯不去使用它。
当一个变量定义为volatile之后,它将具备两种特性。
1. java保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。
关于volatile变量的可见性,经常会被开发人员误解,认为以下描述成立:“volatile变量对所有线程是立即可见的,对volatile变量的所有写操作都能立刻反应到其他线程之中,换句话说,volatile变量在各个线程中是一致的,所以基于volatile变量的运算在并发下是安全的”。这句话的论据部分没有错,但是其论据并不能得出“基于volatile变量的运算在并发下是安全的”这个结论。volatile变量在各个线程的工作内存中不存在一致性问题,但是Java的运算并非原子操作。
2. 使用volatile的第二个语义是禁止指令重排序优化。
参考《深入理解java虚拟机》一书