九 執行緒安全的單例模式

2021-09-29 03:46:04 字數 1274 閱讀 2834

單例模式就是我在乙個應用程式中某乙個類只有乙個單例。將其構造方法私有化,不讓外面的呼叫者呼叫其構造方法。

雙重檢查

/**

* 懶漢式-雙重檢查

* 執行緒不安全的實現

*/public class singledcl

public static singledcl getinstance()}}

return singledcl;

}}

這樣,對外提供乙個getinstance()方法,外部呼叫者即可獲取到這個物件的例項。考慮到多執行緒的場景下,先去檢查這個物件有沒有被建立出來,如果物件為null,則對這個類進行加鎖(保證只有乙個執行緒可以進入)。進入這個執行緒之後,再做第二次檢查,如果還沒有產生例項,則new出乙個物件的例項,將這個例項返回出去。

但是這種實現是一種不安全的實現

加鎖之後為什麼要做第二次檢查?它擔心在我進入這個**塊之前,已經有乙個執行緒先進入了,因為cpu切換時間片將執行緒喚起是需要時間的,檢查完如果確實沒有建立例項,則證明我是第乙個拿到這把鎖的,順其自然地去建立這個物件。

jvm底層

new關鍵字建立物件的時候,在jvm底層包含了三個動作:

解決方法?

加乙個關鍵字即可:volatile

在底層,volatile關鍵字可以抑制指令的重排序。保證執行緒拿到這個物件的時候一定是乙個初始化完成了的。

宣告這個物件的時候,就將物件初始化好。

/**

* 餓漢式

* */

public class singleehan

public static singleehan singledcl = new singleehan();

}

為什麼這種情況執行緒安全?

因為加入了static關鍵字,由虛擬機器替我們進行加鎖,可以保證只有乙個執行緒執行類載入,是由虛擬機器的類載入機制保證的。

/**

* 懶漢式-延遲初始化佔位類模式

*/public class singleinit

private static class instanceholder

public static singleinit getinstance()

}

定義乙個靜態的內部類,裡面有個靜態變數去例項化物件。例項化的操作是在這個類的內部有乙個內部類去實現的。

執行緒安全的單例模式

廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...

執行緒安全的單例模式

單例模式是為了保證乙個類只有乙個例項而且易於外界訪問。所以一般只有把建構函式,拷貝函式,析構函式,賦值函式,變數名變為私有。再用乙個get函式訪問提供介面即可。考慮執行緒安全就要加鎖。一 懶漢模式 1 靜態成員例項的懶漢模式 class singleton public static singlet...

執行緒安全的單例模式

在我們專案中,很多時候需要程式只存在乙個唯一例項。通常在專案中我會把單例模式寫成如下形式 public class singleton public static singleton getinstance return msingleton 通常以這種形式返回乙個類的唯一例項,然而在android...