另人厭煩的執行緒安全單例以及不要使用雙檢測

2021-09-24 12:28:43 字數 902 閱讀 9646

群裡熱烈的討論了執行緒安全的單例;

一路從volitile扯到彙編,從**到**,真是夠了;

首先volitile 跟多執行緒沒直接的關係,或許有些特定情況下會用到;至於spincout之類的實現,內部使用了volitile,這類就不多說了,有興趣的可以自己看實現;

千萬別使用下面** ,

不要使用雙檢測,不要使用雙檢測,不要使用雙檢測:

static  singleton* singleton::instance()  

unlock();

} return _instance;

}

上面**注釋中提到 1-3-2 這種情況一旦發生, 如另一線程進入,直接可得到 _instance ,而這個_instance 目前不確定有沒有

呼叫建構函式,災難由此來了;

如果非要使用上面那個版本,怎麼辦 ? 

static singleton* singleton::instance()  

unlock();

} return _instance;

}

問題是為什麼要搞那麼複雜  , 最簡單又安全的版本:

c11 及以後的版本: 

c11標準定了 , 當乙個執行緒正在初始化乙個變數的時候,其他執行緒必須得等到該初始化完成以後才能訪問它;

注意:這個版本在c11以前不是安全的.

static singleton& getinstance() 

c11以前的版本:

簡單安全又通用

class singleton

}singleton singleton::_instance;

執行緒安全的單例模式(執行緒安全)示例

可以說單例模式是所有設計模式中最簡單的一種。單例模式就是說系統中對於某類的只能有乙個物件,不可能出來第二個。單例模式也是23中設計模式中在面試時少數幾個會要求寫 的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。1.多執行緒安全單例模式例項一 不使用同步鎖 public class s...

執行緒安全的單例模式

廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...

執行緒安全的單例模式

單例模式是為了保證乙個類只有乙個例項而且易於外界訪問。所以一般只有把建構函式,拷貝函式,析構函式,賦值函式,變數名變為私有。再用乙個get函式訪問提供介面即可。考慮執行緒安全就要加鎖。一 懶漢模式 1 靜態成員例項的懶漢模式 class singleton public static singlet...