//貪婪模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public Singleton getInstance(){
return instance;
}
}
//餓漢模式
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
//雙重檢測
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {
}
public Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
雙重檢測為什么加volatile關(guān)鍵字:
主要作用是為了防止指令重排序措近。
新生成一個(gè)對象的正確順序:1、分配對象內(nèi)存 2女淑、內(nèi)存中初始化一個(gè)對象 3瞭郑、將對象指針指向內(nèi)存
指令重排序后可能instance指針先指向了內(nèi)存,此時(shí)instance不為null鸭你,但對象還未初始化完成屈张。