單例模式就是我在乙個應用程式中某乙個類只有乙個單例。將其構造方法私有化,不讓外面的呼叫者呼叫其構造方法。
雙重檢查
/**
* 懶漢式-雙重檢查
* 執行緒不安全的實現
*/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...