詳細解說單例模式

2021-10-24 15:52:56 字數 1547 閱讀 3650

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 單例模式的特點 單例模式的主要特點是 三私一公...