設計模式 單例模式(二)雙重校驗鎖模式

2022-08-19 12:39:09 字數 1052 閱讀 6445

雙重檢驗鎖模式(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 時,必須要獲取鎖,否則,這些執行緒可能同時去建立物件,或者某個執行緒會得到乙個未完全初始化的物件。鎖可以通過代價很高的同步來獲得,就像下面的例子一樣。這樣寫...