多執行緒下的單例模式安全性

2021-10-08 03:23:24 字數 1293 閱讀 5188

public

class

singletondemo

public

static singletondemo getinstace()

return instace;

}public

static

void

main

(string[

] args)

}// main方法只進入一次,說明只new了一次物件。getinstance多次都是true 驗證了單例

上述的**在單機模式下是沒有問題的,但如果此時有多個執行緒同時去getinstance方法,就會出問題,如下:

public

static

void

main

(string[

] args)

,string.

valueof

( i )).

start()

;}}}

// main方法進入了多次,說明單例模式建立失敗,因此在多執行緒下,這種方式來建立單例是不可取的

//解決方案:可以給getinstance方法加synchronized關鍵字,但synchronized級別太重,會導致效能較差,

在加鎖前後加鎖後都進行為null判斷。

public

class

singletondemo

public

static singletondemo getinstace()

}}return instace;

}public

static

void

main

(string[

] args)

,string.

valueof

( i )).

start()

;}}}

// 列印:enter the main method ...

// 說明:main方法進入了一次,說明單例模式建立成功

說明:dcl 不一定執行緒安全,因為會存在指令重排,假如volatile可以禁止指令重排。

原因在於:某個執行緒執行第一次檢測,讀到instance不為null,可能是已經分配空間,但未完成初始化。

instance = new singltondemo()可分為三步:

2,3 沒有資料依賴關係,因此會發生指令重排

正確的解決方案:volatile+ dcl

單例模式的執行緒安全性

單例模式是設計模式中比較簡單的一種。適合於乙個類只有乙個例項的情況,比如視窗管理器,列印緩衝池和檔案系統,它們都是原型的例子。典型的情況是,那些物件的型別被遍及乙個軟體系統的不同物件訪問,因此需要乙個全域性的訪問 指標,這便是眾所周知的單例模式的應用。經典的單例模式有三種,懶漢式 餓漢式和懶漢式單例...

多執行緒安全單例模式

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

多執行緒安全的單例模式

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