雙重檢驗鎖模式(double checked locking pattern),是一種使用同步塊加鎖的方法。程式設計師稱其為雙重檢查鎖,因為會有兩次檢查
instance == null,一次是在同步塊外,一次是在同步塊內。為什麼在同步塊內還要再檢驗一次?因為可能會有多個執行緒一起進入同步
塊外的 if,如果在同步塊內不進行二次檢驗的話就會生成多個例項了。
**實現:
package com.jn.pro;
/* * 雙重校驗鎖
*/public class singletonclass2
public static singletonclass2 getinstance()
}} return instance;
}}
測試類:
package com.jn.pro;
/* * 雙重校驗鎖測試類
*/public class singletonclasstest2
} public static void main(string args)
}
執行結果:
第一次取得例項sc1
第二次取得例項sc2
sc1和sc2是同乙個例項(雙重校驗鎖模式)
注意:instance = new singleton()這句,這並非是乙個原子操作,事實上在 jvm 中這句話大概做了下面 3 件事情。
1.給 instance 分配記憶體
2.呼叫 singleton 的建構函式來初始化成員變數
3.將instance物件指向分配的記憶體空間(執行完這步 instance 就為非 null 了)
volatile
:volatile 可以禁止指令重排序優化。也就是說,在 volatile 變數的賦值操作後面會有乙個記憶體屏障(生成的彙編**上),讀操作不會被重排序到記憶體屏障之前。比如上面的例子,取操作必須在執行完 1-2-3 之後或者 1-3-2 之後,不存在執行到 1-3 然後取到值的情況。
單例模式 雙重校驗鎖
單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...
雙重校驗鎖實現單例模式
1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...
單例模式中的雙重校驗鎖
單執行緒的時候 class foo return helper 這段在使用多執行緒的情況下無法正常工作。在多個執行緒同時呼叫gethelper 時,必須要獲取鎖,否則,這些執行緒可能同時去建立物件,或者某個執行緒會得到乙個未完全初始化的物件。鎖可以通過代價很高的同步來獲得,就像下面的例子一樣。這樣寫...