多執行緒環境下怎樣的單例模式是最安全的

2022-06-26 16:09:17 字數 2577 閱讀 9960

單例模式在實現上,有以下幾點要求:

(1) 構造器私有化

(2) 自行建立,並且用靜態變數儲存

(3) 向外提供這個例項

(4) 強調這是乙個單例,用static關鍵字修飾

按照建立例項的時機,又有懶漢式和餓漢式兩種實現模式。

1

package

single;23

/**4

* 餓漢式,類一載入直接建立好例項物件5*

6* (1) 構造器私有化

7* (2) 自行建立,並且用靜態變數儲存

8* (3) 向外提供這個例項

9* (4) 強調這是乙個單例,用static關鍵字修飾

10*/

11public

class

singleton1

16public

static

singleton1 getinstance()

19 }

如果在建立例項時需要傳參,可以對以上**進行改造如下:

1

package

single;23

/**4

* 可以給類傳參的餓漢式寫法,對第一種方法的改造5*/

6public

class

singleton3

1213

static

16public

static

singleton3 getinstance()

19 }

懶漢式:呼叫獲取例項的方法時才建立例項,在多執行緒環境下會出現執行緒安全問題

•不加處理的懶漢式:

1

package

single;23

/**4

* 懶漢式單例模式5*/

6public

class

singleton4

11public

static

singleton4 getinstance()

15return

instance;16}

17 }

不加執行緒安全處理的懶漢式在多執行緒併發時極有可能建立多個例項達不到單例的作用,這時可以使用synchronized關鍵字修飾獲取例項的方法,通過加鎖控制建立例項的執行緒。

1

package

single;23

/**4

* 懶漢式單例模式5*/

6public

class

singleton4

11public

static

synchronized

singleton4 getinstance()

15return

instance;16}

17 }

但是考慮到效能開銷問題。用synchronized關鍵字修飾整個方法鎖的粒度太大,可以使用雙端檢測機制來實現更精準的加鎖,減小效能開銷。

1

package

single;23

/**4

* 為解決多執行緒情況下的可能被建立多個例項的情況,在例項為空,建立第乙個例項的時候加入synchronize同步鎖5*/

6public

class

singleton5

11public

static

singleton5 getinstance() catch

(interruptedexception e)

22 instance = new

singleton5();23}

24}25}

26return

instance;27}

28}2930

class

test).start();36}

37}38 }

很多人以為這樣就是執行緒最安全的懶漢式單例模式,然鵝,到這裡還並沒有結束!多執行緒環境下在建立例項時會出現指令重排所帶來的問題。建立例項時會發生指令重排,雖然問題機率非常低,但仍不排除指令重排的問題。這時需要用volatile關鍵字來修飾例項來解決指令重排序問題。

1

package

single;23

/**4

* 為解決多執行緒情況下的可能被建立多個例項的情況,在例項為空,建立第乙個例項的時候加入synchronize同步鎖5*/

6public

class

singleton5

11public

static

singleton5 getinstance() catch

(interruptedexception e)

22 instance = new

singleton5();23}

24}25}

26return

instance;27}

28}2930

class

test).start();36}

37}38 }

多執行緒環境下實現單例模式

1 餓漢式 就是在使用類時就將物件建立完畢 例項 public class myobject public static myobject getinstance 測試 public static void main string args 結果 可見hashcode的值一樣的。所有相同物件 2 懶...

多執行緒下的單例模式

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

多執行緒下的單例模式

在多執行緒下的singleton模式是有弊端的,但如何解決呢?辦法是使用lock機制。今天研究的lock機制,並且順便了解了些關於多執行緒的cpu層面的機制。在單個cpu的環境下,在系統的某一時間下cpu只能做一件事情,乙個時間片 slice 這個是cpu執行最小單位。在系統中有多個程序看起來好像是...