May
12
2008
Java Volatile
理解Java越多,就越发觉Java和C++的差异,这次是volatile。
共享
在C/C++中,volatile用于指示编译器对于这类变量的访问不要做优化,常用于一些硬件相关的读写中,在Java中,volatile的意思与C相似,但除了硬件相关外,还有一个更常见的使用场合,是用于多线程,在Java中,如果一个线程写变量,另一个线程读变量,读变量的线程可能不能“即时”获得被修改后的值,这是Java的一个实现约定,也是和JVM的实现相关,所以为了保证这种多线程共享变量的可见性,需要使用volatile。
互斥
要注意到,Java中synchronized也可以达到和volatile相同的作用,即使用synchronized做互斥时自动也达到了共享的目的,但反过来volatile就不能代替synchronized来做互斥,比如说非原子类型的变量(long/double之类)即使加volatile做++操作,也不是线程安全的,这时是需要使用synchronized的。
这样看来,Java中volatile的使用场合应该不是很多(因为多线程情况下,需要共享又不要互斥的情况不多),常见的使用诸如线程的控制循环退出的变量,一些标志变量等等,这些地方不涉及互斥,所以可以用volatile来简化。