Java中的volatile关键字功能和用法
首先简要了解一下Java虚拟机的内存模型
Java把所有的变量都存在主存(相当于物理内存)当中,每个线程都有自己的工作内存(相当于CPU高速缓存)。线程在 自己的工作内存中做操作,不能直接对主存进行操作,最后把结果返回到主存。
其次就是关于volatile关键字
如果一个变量有 volatile 修饰词,这意味着:当有一个线程修改了这个变量,系统会把工作内存当中的变化强制立刻返回到主存当中。当其他线程读取这个变量的时候,读取的是变化了的新值。
volatile其实就保证了此变量无论怎么变, 任何线程看都是最新的。当两个线程,根据一个共同的信号,做互动时,一定要加volatile,保证这个信号是最新的。
实例
我们使用 单例模式 的创建类的方法来进行演示,假设每次得到的类Emperord的对象都是同一个对象:
public class Emperor{
//volatile关键字保证emperor在所有线程中都同步,都是最新的一个值
private static volatile Emperor emperor = null;
//构造方法私有化,避免在类的外部创建对象
private Emperor(){}
//synchronized保证线程之间进行排队
public static synchronized Emperor getInstance(){
if(emperor == null)
emperor = new Emperor;
return emperor;
}
不管有多少线程同时调用getInstance()方法,获取到的都是唯一的一个最新的Emperor的对象。另外对sychronized关键字陌生可以查看我的这一偏博客:显式锁与隐式锁的异同。