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

2021-09-18 07:31:16 字數 1366 閱讀 2109

單例會帶來什麼問題?

如果多個執行緒同時呼叫這個例項,會有執行緒安全的問題

單例一般用在什麼地方?

單例的目的是為了保證執行時只有唯一的乙個例項,最常用的地方比如拿到資料庫的連線,或者spring的中建立beanfactory操作,而這些操作都是呼叫他們的方法來執行某個特定的動作。

首先先來認識下兩種模式: 惡漢式 懶漢式

public class myfactory

//懶漢式用到的時候在建立,不用就不建立(有執行緒安全問題)

private static myfactory instance = null;

public static myfactory getinstance()

}下面總結一下解決執行緒安全的幾種方式:

方法一:在myfactory 中加入了乙個私有靜態內部類instanceholder ,對外提供的介面是 getinstance()方法,也就是只有在myfactory.getinstance()的時候,instance物件才會被建立,,沒有使用同步。保證了只有乙個例項,還同時具有了lazy的特性

public class myfactory

public static myfactory getinstance()

測試**

import static org.junit.assert.*;

import org.junit.test;

public class myfactorytest

}方式二:(懶漢式)

這種方式也沒有使用同步,並且確保了呼叫static getinstance()方法時才建立myfactory的引用,

private static myfactory instance = new myfactory();

public static myfactory getinstance()

測試**:同方法一

方式三:使用synchronized ,通常會鎖定整個方法的是比較耗費資源的,實際會產生多執行緒訪問問題的是這一句**instance = new myfactory();

為了減少資源的消耗,只鎖這一句就行了, 兩個執行緒併發地進入第一次判斷instance是否為空的if 語句內部,乙個執行緒獲得了鎖執行new操作,另乙個執行緒被阻塞,

當第乙個執行緒執行完畢之後,第二個執行緒如果直接進行new操作也是不安全的。為了避免第二次new操作,新增第二次條件判斷,既二次檢查

private static myfactory instance;

public static myfactory getinstance()}}

return instance;

}

測試** 同方法一

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

大家都知道單例模式有兩種,分別是懶漢式 餓漢式。但是對於餓漢式,由於判斷例項為null與建立物件的操作並不是乙個原子性操作,故在 普通的懶漢式單例 非執行緒安全問題 1 2 created by ywb 3 4public class singleton 910 public static sing...

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

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

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

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