單例模式之雙檢查

2021-10-05 14:26:45 字數 821 閱讀 3626

public

final

class

singleton

private

static singleton instance = null;

public

static singleton getinstance()

}}return instance;

}}

第乙個空判斷是:執行緒已經執行完**,之後的執行緒再執行時,不需要建立即進入if判斷語句塊,直接返回即可。

第二個空判斷是:當多個執行緒同時到達synchronized**時,由於加鎖,只有乙個執行緒進入,當第二個執行緒進入時,不需要建立,直接返回即可。

看起來沒有問題呀!!為什麼這麼寫不行呢?

原因在於instance = new singleton();在jvm底層的指令是分開的,先通過建構函式建立物件,再賦值給引用,由於指令重排序,可能是先賦值引用,再建立物件。這就會出現問題:

指令重排序後,先賦值引用;

第二個執行緒進來之後,返現不為空,直接返回了,但此時還沒有通過建構函式建立物件。

解決方法:使用volatile關鍵字修飾

public

final

class

singleton

private

static

volatile singleton instance = null;

public

static singleton getinstance()

}}return instance;

}}

單例模式之雙重檢查

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

單例模式的雙重檢查

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

單例模式 雙重檢查鎖

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