單例模式中的雙重校驗鎖

2022-08-17 13:36:20 字數 803 閱讀 1950

//

單執行緒的時候

class

foo

return

helper;

}}

這段在使用多執行緒的情況下無法正常工作。在多個執行緒同時呼叫gethelper()時,必須要獲取鎖,否則,這些執行緒可能同時去建立物件,或者某個執行緒會得到乙個未完全初始化的物件。

鎖可以通過代價很高的同步來獲得,就像下面的例子一樣。

//

這樣寫雖然正確,但是粗暴地把gethelper鎖住了,這樣代價很大

class

foo

return

helper;

}}

只有gethelper()的第一次呼叫需要同步建立物件,建立之後gethelper()只是簡單的返回成員變數,而這裡是無需同步的。 由於同步乙個方法會降低100倍或更高的效能[2]

, 每次呼叫獲取和釋放鎖的開銷似乎是可以避免的:一旦初始化完成,獲取和釋放鎖就顯得很不必要。許多程式設計師一下面這種方式進行優化:

檢查變數是否被初始化(不去獲得鎖),如果已被初始化立即返回這個變數。

獲取鎖第二次檢查變數是否已經被初始化:如果其他執行緒曾獲取過鎖,那麼變數已被初始化,返回初始化的變數。

否則,初始化並返回變數。

//

這種雙重檢查鎖定就很好地解決問題,避免每次呼叫都要獲取鎖

class

foo }}

return

helper;

}}

單例模式 雙重校驗鎖

單例模式 雙重校驗鎖 author szekinwin public class singleton3 私有化構造方法 private static volatile singleton3 singleton null public static singleton3 getinstance ret...

單例雙重校驗鎖

public class singledoublelock 1 第一次校驗 因為該類是單例的只建立一次,大部分時間single都不為空,所以不會進行第一次檢驗的 塊內部,從而提高效率 2 第二次校驗 如果single為空,執行緒t1,t2進入第一次檢驗的 塊,t1執行synchronized 塊 n...

雙重校驗鎖實現單例模式

1 先上 public class singleton public static singleton getinstance return instance 2 分析 第一次校驗 instance null 單例模式只需要建立乙個例項,假如例項不為空則不需要去競爭鎖,提高效能 第二次校驗 inst...