Gavin on Backend Technology

backend and more

重新认识volatile

误解

一直以来,我是这么理解volatile关键字的:该修饰符修饰的变量将不会被缓存(寄存器、处理器二级缓存等),而是直接写入主内存中或从直接主内存中读取。如此,不同的线程间对该变量的读/写到的值都是最新的,也可确保在多线程条件下的正确性,至于什么才叫正确、为什么必须要正确,之前并没有多想。

最近拜读了infoq的mini书:《深入理解Java内存模型》(http://www.infoq.com/cn/minibooks/java_memory_model ),让我重新认识了Volatile关键字的真实意义和虚拟机的实现机制。本文以本人对volatile的目的、实现等为线索,对该书中volatile部分叙述重新整理,并结合相关资料,试图对volatile做一个个人总结,希望对读者也有所裨益。

Volatile的真正作用

开门见山地说,Volatile修饰的变量可以作为线程间协作的“信号量”,此信号量从一个线程被“传递”到另外一个线程,以达到线程协作的目的。从这个角度上说,volatile与“锁”或Synchronized关键字类似,都能达到线程协作的目的。