public class singleton
public static singleton getinstance()
}
public class singleton
private singleton()
public static singleton getinstance()
}
優點:在類裝載的時候就完成了例項化,避免了執行緒同步問題。
缺點:在類裝載的時候就完成了例項化,而沒有達到懶載入的效果,所以如果從始至終都沒有使用到這個例項,就會造成記憶體的浪費。
1)普通的懶漢式單例模式寫法(只能在單執行緒環境下使用)
//存在多執行緒不安全情況
public class singleton
public static singleton getinstance()
return singleton;
}}
2)雙重檢查鎖定式
//可以有效解決多執行緒安全問題,但是解決不了序列化和反序列化問題
public class singleton
public static singleton getinstance()}}
return singleton;
}}
優點:不僅執行緒安全,並且延遲載入,效率也更高;
常見問題:
為什麼要兩次check,而不能一次check呢?
假設有兩個執行緒同時呼叫getinstance方法,並且由於singleton是空的,所以兩個執行緒都通過了第乙個if判斷,由於有鎖機制的存在,會有乙個執行緒先進入第二重if的判斷,而另乙個執行緒就在外面等待,而當第乙個執行緒完成例項後,就會推出synchronized保護的區域,這時如果沒有第二層singleton==null的話,那麼第二個執行緒就會再次建立例項,這就破壞了單例,這肯定是不行的;
而對於第乙個check而言,如果去掉它,那麼所有的執行緒都會序列執行,效率低下,所以兩個check都是需要保留的。
3)靜態內部類式(由jvm來保證執行緒安全問題)
public class singleton
private static class singletoninstance
public static singleton getinstance()
}
4)列舉式(最推薦的單例模式的方式)
public enum singleton
}
優點:寫法簡潔,避免多執行緒同步的問題,而且還能防止反序列化和反射建立新的物件來破壞單例。
直接通過singleton.instance.whatevermethod()的方式呼叫即可,方便、簡潔又安全。
為什麼需要單例呢?
原因一:節省記憶體,節省運算;
原因二:保證結果的正確性以及方便管理。
什麼時候可以用到單例模式?
無狀態的工具類:日誌工具、字串工具
全域性資訊類:全域性計數、環境變數
單例模式(詳細)
b站學習做的筆記 單例模式就是採取一定的方法保證整個軟體 統裡面對於某個類只能存在乙個例項 並且該類只提供乙個取物件例項的方法 靜態方法 餓漢式 靜態常量 餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全 同步方法 雙重檢查 靜態內部類 列舉 餓漢式的兩種寫法 1靜態常量 步驟 1.構造器...
單例模式詳細案例
單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法 靜態方法 比如hibernate的sessionfactory,它充當資料儲存源的 並負責建立session物件。sessionfactory並不是輕量級的,一般情況下,乙個...
php單例模式詳細介紹
1 單例模式的概念 單例模式是指整個應用中某個類只有乙個物件例項的設計模式。具體來說,作為物件的建立方式。單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統全域性的提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回乙個引用。2 單例模式的特點 單例模式的主要特點是 三私一公...