多執行緒下各種單例singleton的實現對比

2021-05-24 23:51:17 字數 742 閱讀 4580

在多執行緒程式設計中,單例一直是非常難以處理的問題。流行的實現方法都有各種理論上的缺陷:

1. 靜態成員變數實現方式

無法保證單例本身的構造和析構時機, 使用有很大限制。包括全域性靜態變數也是同理

2. 區域性靜態變數

這個實現很優美,而且是到實際使用時物件才被構建, 但是仍然有很多缺點。

首先, 不能保證多執行緒安全, 在構建單例時可能發生多執行緒同時呼叫建構函式的問題;

其次, 單例析構後, 其他**仍然可能訪問到(例如日誌模組), 可能導致難以檢測的很嚴重的問題, 常見的是段錯誤。(說到這裡, 全域性靜態變數一定要注意, 要麼能夠確認該函式不會在區域性靜態變數析構後被呼叫, 要麼使用簡單資料型別, 不存在析構後呼叫出問題的那種)

3. 上鎖並兩次檢驗

(其中關於lock,guard是多執行緒常用加鎖方式)

這種加鎖並兩次驗證的方式保證了單例的構建安全性,但是仍然有問題: 全域性的鎖lock本身安全性怎麼保證?什麼時候delete掉單例?

4. boost::singleton的實現方式

從理論上保證了不存在安全性問題, 無論是在main()函式呼叫前還是結束後的任何時候, 訪問單例都沒有問題, 無須在呼叫的時候瞻前顧後。但是,也有不足的地方,不能在程式中析構單例。(至於main()呼叫之前不進入多執行緒模式,這個應該不成問題)

另外可以擴充套件著使用:

多執行緒下安全又完美的單例實現,基本是不可能了。但是可以根據不同情況選擇著使用。

附上boost::singleton實現

多執行緒下的單例

1多執行緒安全單例模式一 不使用同步鎖 1 1 public classsingleton 4 4 private staticsingleton singleton 5 5 6 6 public staticsingleton getinstance 7 7 12 12 returnsinglet...

多執行緒下的單例(靜態類單例)

定義乙個單例model package com.shirt.test author xiaxt date 2018 12 21.public class runmodel private runmodel setisrunning boolean b private runmodel setmess...

多執行緒下的單例模式

單例模式分為兩種 懶漢單例模式和餓漢式單例模式 public class singleton private static singleton single null public static singleton getinstance return single 在單執行緒中,這樣寫,不會存在任...