1.使用单例时为什么需要volatile
public class Singleton {
private static volatile Singleton singleton = null;
private Singleton(){}
public static Singleton getSingleton(){
if (singleton == null){
synchronized (Singleton.class){
if (singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
在jvm在设计时会考虑性能问题,执行代码会有无序性(只在多线程下回考虑),比如instance = new Singleton();这段代码在jvm中会执行三个指令,第一是为instance分配内存,第二步是初始化对象,第三步为instance赋值一个地址.
此时线程A和B,当线程在执行singleton = new Singleton()时,刚好把第一和第三部执行后,线程B拿到cpu分配的时间片刚好执行到synchronized (Singleton.class)上面这一段if (singleton == null)时,判断到singleton不为空,直接返回singleton实例回去,但是此时线程A的第二步并没有执行,此时线程B拿到的对象时无效的,就会出现错误.
那么singleton成员变量加了volatile后,与singleton成员变量有关的代码段就会设置成有序性,以第一步,第二步,第三步这样的顺序执行.这样就避免了其他出现问题.