//單執行緒的時候
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...