單例模式 雙重檢查鎖

2021-10-05 15:19:10 字數 843 閱讀 9808

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

public

class

singleton

public

static singleton getsingleton()

}}return singleton;

}}

一、第一次判斷singleton是否為null

第一次判斷是在synchronized同步**塊外進行判斷,由於單例模式只會建立乙個例項,並通過getinstance方法返回singleton物件,所以,第一次判斷,是為了在singleton物件已經建立的情況下,避免進入同步**塊,提公升效率。

二、第二次判斷singleton是否為null

第二次判斷是為了避免以下情況的發生。

(1)假設:執行緒a已經經過第一次判斷,判斷singleton=null,準備進入同步**塊.

(2)此時執行緒b獲得時間片,猶豫執行緒a並沒有建立例項,所以,判斷singleton仍然=null,所以執行緒b建立了例項singleton。

(3)此時,執行緒a再次獲得時間片,猶豫剛剛經過第一次判斷singleton=null(不會重複判斷),進入同步**塊,這個時候,我們如果不加入第二次判斷的話,那麼執行緒a又會創造乙個例項singleton,就不滿足我們的單例模式的要求,所以第二次判斷是很有必要的。

三、為什麼要加volatile關鍵字?

保證記憶體的可見性。

單例模式之雙重檢查

在實現單例模式時,如果未考慮多執行緒的情況,就容易寫出下面的錯誤 public class singleton public singleton getinstance return uniquesingleton 在多執行緒的情況下,這樣寫可能會導致uniquesingleton有多個例項。比如下...

單例模式的雙重檢查

單例模式 public class singleton public static singleton getinstance return uniqueinstance 其中有兩次判斷是否為空的語句,第一次是為了提高效率,避免每次都要執行同步 塊,第二次判空,是為了避免多執行緒帶來的不安全,當兩個...

單例模式 雙重校驗鎖

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