volatile特性
内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。
对于volatile修饰的变量,读操作时JMM会把工作内存中对应的值设为无效,要求线程从主内存中读取数据;写操作时JMM会把工作内存中对应的数据刷新到主内存中,这种情况下,其它线程就可以读取变量的最新值。
注意:
若对变量的写操作依赖当前值,如多线程下执行a++,是无法通过volatile保证结果准确性的,可以参考这篇文章。
应用:
在上篇单例模式中,对于懒汉模式的优化方案二中有用到volatile关键字。
//volatile 修饰的变量值 不会被本地线程缓存
private static volatile Singleton singleton = null; //保证instance对象每次都是从主内存中读取最新的值
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton(); //不是原子操作
}
}
}
return singleton;
}