java單例模式中的雙重檢驗鎖

2021-08-19 23:50:16 字數 499 閱讀 8055

public class doublecheck 

public static doublecheck getsingleton()

}} return instance;

}}

首先判斷instance是否為null,如果確實為null,則進入乙個synchronize包圍的**塊,相當於上了鎖,進入了臨界區,為了防止在判斷為null到進入臨界區的過程中,有執行緒對其new了乙個例項出來,再上鎖完成之後,在對instance是否為null進行一次判斷。

上面是乙個單例模式雙重檢查鎖的實現。

上述的重點是:

1. 使用了volatile關鍵字。

2. 兩次判斷 instance==null

3. 對類加鎖

先看第乙個,使用volatile關鍵字。

如果沒有使用volatile這一關鍵字會出現什麼情況呢。

先來說說新建物件之一操作,它不是乙個原子操作。這個操作可以分為4部分:

單例模式中的雙重校驗鎖

單執行緒的時候 class foo return helper 這段在使用多執行緒的情況下無法正常工作。在多個執行緒同時呼叫gethelper 時,必須要獲取鎖,否則,這些執行緒可能同時去建立物件,或者某個執行緒會得到乙個未完全初始化的物件。鎖可以通過代價很高的同步來獲得,就像下面的例子一樣。這樣寫...

單例模式 雙重檢查鎖

單例模式分為餓漢式和懶漢式。餓漢式是事先分配記憶體,提前建立。這樣的方式為到位占用資源,當這種比較多時,會占用很多記憶體。懶漢式是在被呼叫的時候進行。這種在併發時又會導致問題。比較穩妥的辦法是在懶漢式的基礎上加上鎖,然後進行雙重檢查,這種springioc容器式單例也是用這種雙重檢查來避免執行緒衝突...

單例模式 雙重校驗鎖

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