天天看點

Java 單例模式單例模式

保證一個類隻有一個執行個體,并且提供一個通路該執行個體的全局通路點

<code>常見的應用場景</code>:

任務管理器。資源回收筒。網站的計數器。作業系統的檔案系統。在servlet程式設計中,每個servlet也是單例模式,項目中,讀取配置檔案的類,一般也隻有一個對象,資料庫的連接配接池,Application對象等。

<code>優點</code>:

由于單例模式隻生成一個執行個體,減少了系統開銷,當一個對象的産生需要比較多的資源時,如讀取配置檔案,産生其他資源對象時,則可以通過在應用啟動時直接産生一個單例對象,然後永久駐留記憶體的方式來解決

常見的五種單例模式的實作方式:

餓漢式(線程安全,調用效率高,但是不能延時加載)

懶漢式(線程不安全,調用效率不高,但是可以延時加載)

其他:

雙重檢測鎖式(由于JVM底層内部模型原因,偶爾會出問題,不建議使用)

靜态内部類式(線程安全,調用效率高,但是可以延時加載)

枚舉單例(線程安全,調用效率高,不能延時加載)

詳細參考“https://mp.weixin.qq.com/s?__biz=Mzg2MjAzNzAzNg==&amp;tempkey=OTk4X1dlWW5qaHhHWXduR1VBQndYblNvd0JIQ09Xa2w3TlQ3NjUtRVB4TFJqdksxTmNfVEhCQy1MUm84V0l1M3JpRnJQdWFGQUlIazYtVDlTdDBHb3VmWGdYWFo3MUJQdmJnd1pQX3puRmphOXlUeHRmbnJvNzRicUo5cUlLb0p5cVEzTWs4RW5IcWJvanBNZjdxZFZRX0YyZ2tmMWFodnZBMDMxU0dOQnd%2Bfg%3D%3D&amp;chksm=4e0cb41d797b3d0bfebf8573adaf44561e0fb88766cb5a2b691aa269e67bf0f4dbce2656089f#rd”

<code>比較</code>

餓漢式和懶漢式差別

1、線程安全:

餓漢式天生就是線程安全的,可以直接用于多線程而不會出現問題,懶漢式本身是非線程安全的,為了實作線程安全有幾種寫法

2、資源加載和性能:

餓漢式在類建立的同時就執行個體化一個靜态對象出來,不管之後會不會使用這個單例,都會占據一定的記憶體,但是相應的,在第一次調用時速度也會更快,因為其資源已經初始化完成,而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候才會執行個體化對象出來,第一次調用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之後就和餓漢式一樣了。

單例一定就隻會建立一個對象嗎?不一定。

如果有兩個類加載器加載了該單例類,則就可能會建立多個單例執行個體。

每個類加載器都定義了一個命名空間,如果有兩個以上的類加載器,不同的類加載器有可能會加載同一個類,如果多個類加載器同時加載了該單例類,就有可能建立多個單例對象。

如果有這種情況,我們應該自行指定類加載器,并指向同一個類加載器。

上一篇: Java單例模式
下一篇: java單例模式