版本
命令行
Volatile是否有用
JDK 1.2
Java Volatile
是
JDK 1.2
Java –Djava.compiler=NONE Volatile
否
JDK 1.1
Java Volatile
是
JDK 1.1
Java –nojit Volatile
否
JDK 1.0
Java Volatile
否
Sun在VM中包含JIT之前,使用volatile无差异。另外,甚至包含JIT后,每个线程进入或离开同步块,它都会让变量的私有拷贝与共享拷贝一致。Synchronized代码块分布在java.*类库中,因此,开发人员可能没有意识到私有拷贝已经被校准了。例如,Systme.out.println()包含一个synchronized块,所以,在Volatile中使用它打印当前value,保持私有变量为最新值,volatile修饰符似乎没有发挥作用。许多开发人员编写过在一些成员变量上应用了volatile修饰符的代码。但是至少因为以上其中一个原因,volatile不能产生关键性的区别。
Volatile修饰符的存在要求VM总是访问变量的共享拷贝。与VM通过保存一份私有拷贝来执行优化相比,它的效率要低。只在必要时使用volatile,滥用volatile会导致不必要地降低应用程序的执行速度。
小技巧:
在两个或更多线程访问的成员变量上使用volatile时,除非所有的线程都访问synchronized代码块内的变量。如果成员变量构建后保持为常量(即只读),就没有必要声明为volatile。