volatile 变量使用
? ?JAVA中volatile关键字,在许多场合是不推荐使用的。因为,它容易使用不当导致不必要的问题。但是,如果使用得当,它能提供比锁更优的性能。
?volatile单词的英文翻译为:易变的。它在JAVA中的语义就是来标明该变量是容易变化的,
提醒每次当线程读取该变量的时候都要从主内存中同步该变量的值。
?在JAVA中有人把volatile看做是“程度较轻的?synchronized”。与synchronized相比,volatile所需要的读写开销要小很多,但是它实现的功能也只有synchronized的一部分。锁提供了两种特性:互斥与可见性。互斥即为线程间的互斥访问,一次只允许一个线程持有某个特定的锁;可见性是指在线程对数据的修改,对后面访问的线程是可见的。Volatile 变量具有?synchronized?的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。
volatile boolean shutdownRequested;...public void shutdown() { shutdownRequested = true; }public void doWork() { while (!shutdownRequested) { // do stuff }}?很可能会从循环外部调用?shutdown()?方法 —— 即在另一个线程中 —— 因此,需要执行某种同步来确保正确实现shutdownRequested?变量的可见性。(可能会从 JMX 侦听程序、GUI 事件线程中的操作侦听程序、通过 RMI 、通过一个 Web 服务等调用)。然而,使用?synchronized?块编写循环要比使用清单 2 所示的 volatile 状态标志编写麻烦很多。由于 volatile 简化了编码,并且状态标志并不依赖于程序内任何其他状态,因此此处非常适合使用 volatile。
?
?
这种类型的状态标记的一个公共特性是:通常只有一种状态转换;shutdownRequested?标志从?false?转换为?true,然后程序停止。这种模式可以扩展到来回转换的状态标志,但是只有在转换周期不被察觉的情况下才能扩展(从?false?到?true,再转换到false)。此外,还需要某些原子状态转换机制,例如原子变量。