單例模式:
懶漢式在多線程下的可能被多次賦值的情況:
LazySingleton.java
public class LazySingleton {
private static LazySingleton lazySingleton ;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
出現(xiàn)原因:可能會有多個線程同時通過 lazySingleton == null 判斷條件,這樣會同時對lazySingleton賦了兩次值甘苍,在某些情況下可能會不被允許笔喉。解決方法:加同步鎖渣玲,但是這樣開銷會比較大船万,于是有了雙重檢查的這種方式,但是注意添加volatile防止指令重排序怠堪,
為什么雙重檢查鎖模式需要 volatile 乌昔?,
不得不提的volatile及指令重排序(happen-before)
文中介紹了除了雙重檢查模式 還可使用局部變量的方式
雙重檢查方式
public class LazySingleton {
private static volatile LazySingleton lazySingleton ;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
}