多執行緒安全的單例模式

2021-08-21 19:48:34 字數 720 閱讀 3932

執行緒安全的單例模式有多種寫法,下面的這種寫法是我最常用的一種:

public class singleton 

public static singleton getinstance() }}

return singleton;

}}

兩點說明:

1.給singleton加volatile關鍵字是位了禁止指令重排序,因為

singleton = new singleton();

這一步分為三個步驟:分配singleton變數空間,呼叫構造器初始化singleton物件,singleton指向第二步建立的singleton物件。

只有最後一步執行了,singleton 變數才有值,可以返回。但是重排序(編譯器或處理器)可能會改變三個步驟的執行順序,如果第三步先於第二步執行,第三步執行後第二步還未執行,讓出了cpu使用權(singleton變數不為空,但是物件沒有初始化),這個時候另乙個執行緒獲得執行機會,在做singleton變數非空判斷時,發現不為空直接返回該變數,但是使用時是有問題的。為了禁止這種重排序,因此加入了volatile關鍵字,它會禁止指令的重排序,保證了程式的順序執行。

2.synchronized關鍵字的位置

synchronized其實也是可以放在方法中,但是會造成該方法同乙個時刻只能有乙個執行緒訪問。因此放在方法內部,縮小了同步塊的範圍。

多執行緒安全單例模式

在文章開始之前我們還是有必要介紹一下什麼是單例模式。單例模式是為確保乙個類只有乙個例項,並為整個系統提供乙個全域性訪問點的一種模式方法。從概念中體現出了單例的一些特點 1 在任何情況下,單例類永遠只有乙個例項存在 2 單例需要有能力為整個系統提供這一唯一例項 1.全域性變數的缺點 必須在程式一開始就...

c 多執行緒單例模式 執行緒安全C 單例模式

我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...

多執行緒單例模式的安全實現

多執行緒單例模式的實現。通過雙重鎖定,自旋處理,實現安全的多執行緒單例和共享區資料的訪問。資源訪問的形式採用簡單等待處理.同時使用std bind進行函式繫結。atomic lock flag p202 6 3 3.cpp 定義控制台應用程式的入口點。include stdafx.h include...