多執行緒安全單例模式

2021-09-25 04:01:18 字數 2796 閱讀 9717

在文章開始之前我們還是有必要介紹一下什麼是單例模式。單例模式是為確保乙個類只有乙個例項,並為整個系統提供乙個全域性訪問點的一種模式方法。

從概念中體現出了單例的一些特點:

(1)、在任何情況下,單例類永遠只有乙個例項存在

(2)、單例需要有能力為整個系統提供這一唯一例項

1. 全域性變數的缺點:

必須在程式一開始就建立好物件,如果程式在這次的執行過程中又一直沒用到它,就非常耗費資源。

2. 經典的單例模式實現:

public

class

singleton

//注意這個方法也是靜態的 -->獲取屬性

public

static singleton getinstance()

return uniqueinstance;

}}

單例常被用來管理共享的資源,例如 資料庫連線、執行緒池、快取、登錄檔, spring中大量用到單例模式。

單例模式確保乙個類只有乙個例項,並提供乙個全域性訪問點。

這個模式的問題:在多執行緒時,並不能保證這個類只被例項化一次。

3. 處理多執行緒:
public

class

singleton

//注意這個方法也是靜態的 使用synchronized執行緒同步

public

static

synchronized singleton getinstance()

return uniqueinstance;

}}

通過增加synchronized關鍵字到**getinstance()**方法中,迫使每個執行緒在進入方法之前,要先等別的執行緒離開該方法。也就是說,不會有兩個執行緒可以同時進入這個方法。

這種方法存在的問題:只有第一次執行此方法時,才真正需要同步。換句話說,一旦設定好uniqueinstance變數,就不再需要同步這個方法了。之後每次呼叫這個方法,同步都是一種浪費。

4.改善多執行緒

4.1 如果getinstance()的效能對應用程式不是很關鍵,就不用優化了

4.2 使用急切建立例項,而不用延遲例項化的做法

public

class

singleton

public

static singleton getinstance()

}

private static singleton uniqueinstance = new singleton();在靜態初始化器(static initializer)中建立單例,這保證了執行緒安全。

利用這個做法,jvm在載入這個類時馬上建立此唯一的單件例項。jvm保證任何執行緒訪問uniqueinstance靜態變數之前,一定先建立些例項。

4.3 用「雙重檢查加鎖」,在getinstance()中減少使用同步

首先檢查例項是否已經建立,如果尚未建立,才進行同步。這樣一來,只有第一次會同步,這正是我們想要的。

public

class

singleton

public

static singleton getinstance()

}return uniqueinstance;

}}

在最開始如果有1、2、3個執行緒走到了(1)處,假設1進入了同步塊,2、3等待。1例項化後,2進入同步塊,發現uniqueinstance已經不為空,跳出同步塊。接著3進入,又跳出同步塊。

volatile關鍵字確保:當uniqueinstance變數被初始化成singleton例項時,多個執行緒正確地uniqueinstance變數。如果效能是你關心的重點,那麼這個做法可以幫你大大地減少getinstance()的時間耗費。

最後給乙個完整的demo:

package com.gqz.thread;

/* * 單例模式:懶漢式套路 在多執行緒環境下 對外存在乙個物件

* 1、構造器私有化 --> 避免外部 new構造器

* 2、提供私有地屬性 --> 儲存物件的位址

* 3、提供公共的靜態方法--->獲取屬性

*/public

class

doublecheckedlocking

//3、提供公共的靜態方法-->獲取屬性

public

static doublecheckedlocking getinstance()

//防止多個執行緒 需要加上鎖 synchronized

synchronized

(doublecheckedlocking.

class)}

return instance;

}public

static

void

main

(string[

] args));

thread.

start()

; system.out.

println

(doublecheckedlocking.

getinstance()

);}}

com.gqz.thread.doublecheckedlocking@816f27d

com.gqz.thread.doublecheckedlocking@816f27d

表明在多執行緒下,還是得到同乙個單例物件。

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

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

多執行緒安全的單例模式

執行緒安全的單例模式有多種寫法,下面的這種寫法是我最常用的一種 public class singleton public static singleton getinstance return singleton 兩點說明 1.給singleton加volatile關鍵字是位了禁止指令重排序,因為...

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

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