public class Singleton {
private volatile static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
volatile的作用。
new 一个对象
1、分配内存空间 2、执行构造方法 3、把这个对象指向这个空间
但是指令重排的特性使得可以1 3 2步骤执行
假如A线程执行132 B线程在A执行到3的时候,空间不为空,误以为对象已创建,结果直接return ,返回了个“空”。
给变量加上volatile时候,由于禁止指令重排的特性,使得建立时候严格按照1 2 3步骤行进,就不会出现我上述的特例了