單例模式的執行緒安全問題

2022-08-05 10:18:16 字數 1379 閱讀 7331

大家都知道單例模式有兩種,分別是懶漢式、餓漢式。但是對於餓漢式,由於判斷例項為null與建立物件的操作並不是乙個原子性操作,故在

普通的懶漢式單例(非執行緒安全問題):

1

/**2

* created by ywb 3*/

4public

class

singleton 910

public

static

singleton getinstance()

14return

singleton;

1516

}17 }

第11-13行**是執行緒不安全的,為解決問題,可以進行如下改變:

演化版本1:

1

/**2

* created by ywb 3*/

4public

class

singleton

1011

public

synchronized

static

singleton getinstance()

15return

singleton;16}

17 }

這個版本雖然解決了執行緒安全問題,但是 synchronized 關鍵字 卻引入了效能問題,可以考慮採用synchronized塊縮小同步範圍

演化版本2:

1

/**2

* created by ywb 3*/

4public

class

singleton

1011

public

static

singleton getinstance() 16}

17return

singleton;18}

19 }

但是版本2卻是存在問題,重新引入了執行緒安全問題,同步塊裡可以再次加乙個null判斷

演化版本3:

1

package

com.tong.qiu;23

/**4

* created by ywb5*/

6public

class

singleton

1213

public

static

singleton getinstance() 19}

20}21return

singleton;22}

23 }

第8行加入了volatile為了保證記憶體可見性,本版本最終解決了執行緒安全問題又相容考慮了效能問題。

單例模式的執行緒安全問題

單例會帶來什麼問題?如果多個執行緒同時呼叫這個例項,會有執行緒安全的問題 單例一般用在什麼地方?單例的目的是為了保證執行時只有唯一的乙個例項,最常用的地方比如拿到資料庫的連線,或者spring的中建立beanfactory操作,而這些操作都是呼叫他們的方法來執行某個特定的動作。首先先來認識下兩種模式...

單例模式及執行緒安全問題

單例模式是為確保乙個類只有乙個例項,並為整個系統提供乙個全域性訪問點的一種模式方法。從概念中體現出了單例的一些特點 1 在任何情況下,單例類永遠只有乙個例項存在 2 單例需要有能力為整個系統提供這一唯一例項 下面是實現 package org.mlinge.s02 public class mysi...

單例模式和執行緒安全問題

單例模式是一種常用的軟體設計模式,其定義是單例物件的類只能允許乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些...