原文:@程序員小灰
單例模式第一版
public class Singleton {
private Singleton() {} //私有構造函數
private static Singleton instance; //單例對象
//靜態工廠方法
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
單例模式第二版
在第一版的基礎上加上雙重加鎖檢測,防止并發時候創建多個對象
public class Singleton {
private Singleton() {} //私有構造函數
private static Singleton instance = null; //單例對象
//靜態工廠方法
public static Singleton getInstance() {
if (instance == null) { //雙重檢測機制
synchronized (Singleton.class){ //同步鎖
if (instance == null) { //雙重檢測機制
instance = new Singleton();
}
}
}
return instance;
}
}
單例模式第三版
volatile :
防止指令重排
public class Singleton {
private Singleton() {} //私有構造函數
private volatile static Singleton instance = null; //單例對象
//靜態工廠方法
public static Singleton getInstance() {
if (instance == null) { //雙重檢測機制
synchronized (Singleton.class){ //同步鎖
if (instance == null) { //雙重檢測機制
instance = new Singleton();
}
}
}
return instance;
}
}
單例模式第四版(推薦使用)
利用ClassLoader
的加載機制來實現懶加載,并保證構建的單例線程安全。
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}