單例模式雙重檢驗鎖的判斷是否為null的意義

2021-10-03 16:22:07 字數 665 閱讀 8238

關於雙重檢驗鎖,首先簡單來看乙個小例子,**如下:

public

class

singleton

public

static singleton getinstance()

}}return instance;

}}

雙重檢驗鎖是對同步塊加鎖的方法。為什麼會稱為雙重檢驗,因為有兩次對 instance == null的檢查,一次中同步塊中一次中同步塊外部。

對於兩次instance的是否為空的判斷解釋:

1.為何在synchronization外面的判斷?

為了提高效能!如果拿掉這次的判斷那麼在行的時候就會直接的執行synchronization,所以這會使每個getinstance()都會得到乙個靜態內部鎖,這樣的話鎖的獲得以及釋放的開銷(包括上下文切換,記憶體同步等)都不可避免,降低了效率。所以在synchronization前面再加一次判斷是否為空,則會大大降低synchronization塊的執行次數。

2.為何在synchronization內部還要執行一次呢?

因為可能會有多個執行緒一起進入同步塊外的 if,如果在同步塊內不進行二次檢驗的話就會生成多個例項了。

ps:雙重檢驗情況下,儲存例項的唯一的靜態變數要用volatile修飾,volatile能禁止指令重排。

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

public class doublecheck public static doublecheck getsingleton return instance 首先判斷instance是否為null,如果確實為null,則進入乙個synchronize包圍的 塊,相當於上了鎖,進入了臨界區,為了防止...

單例模式 雙重檢查鎖

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

單例模式 雙重校驗鎖

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