修饰单个值
-
c/c++
只保证可见性,内存栅栏可使用std::atomic_thread_fence,或者使用锁语义,不要滥用volatile。 -
java
jdk1.5后修正了内存模型,对volatile变量的操作不仅可以保证可见性,且带有内存屏障的副作用。
所以,带volatile双重判断的单例写法在jdk1.5后都是对的。
class Singleton{
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
修饰数组
-
c/c++
c99和c++标准规定:
volatile的数组保证所元素的可见性,当然了和元素一样只是可见性。 -
java
volatile的数组只针对数组的引用具有volatile的语义,而不是它的元素**