單例雙重檢查引發的資源競爭 資料競爭

2022-02-22 12:01:28 字數 412 閱讀 1921

最近在寫golang**,使用go編譯器的race分析工具,提公升以下**有資源競爭的問題:

1 type memcache struct45

var memcacheinstance *memcache

6var

memcachecreatemutex sync.mutex

78 func getmemcache() *memcache 17}

18}19return

memcacheinstance

20 }

嚴格分析的話,加鎖之前讀取 memcacheinstance 的操作的確存在資源爭奪的問題,但是似乎這種雙重檢查的寫法在單例模式中十分常見,屬於常規操作。如果不加雙重檢查,每次讀取都需要加鎖,肯定要影響效能。這種看似無害的資源競爭是否可以存在呢?

單例模式的雙重檢查

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

單例模式之雙重檢查

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

單例模式 雙重檢查鎖

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