溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java 單例模式

發(fā)布時間:2020-08-13 03:53:48 來源:網(wǎng)絡(luò) 閱讀:254 作者:teddy_life 欄目:編程語言

單例模式

保證一個類只有一個實例,并且提供一個訪問該實例的全局訪問點

常見的應(yīng)用場景

任務(wù)管理器?;厥照?。網(wǎng)站的計數(shù)器。操作系統(tǒng)的文件系統(tǒng)。在servlet編程中,每個servlet也是單例模式,項目中,讀取配置文件的類,一般也只有一個對象,數(shù)據(jù)庫的連接池,Application對象等。
優(yōu)點

由于單例模式只生成一個實例,減少了系統(tǒng)開銷,當一個對象的產(chǎn)生需要比較多的資源時,如讀取配置文件,產(chǎn)生其他資源對象時,則可以通過在應(yīng)用啟動時直接產(chǎn)生一個單例對象,然后永久駐留內(nèi)存的方式來解決


常見的五種單例模式的實現(xiàn)方式:
餓漢式(線程安全,調(diào)用效率高,但是不能延時加載)
懶漢式(線程不安全,調(diào)用效率不高,但是可以延時加載)

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

靜態(tài)內(nèi)部類式(線程安全,調(diào)用效率高,但是可以延時加載)

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

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

比較

餓漢式和懶漢式區(qū)別

1、線程安全

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

2、資源加載和性能

餓漢式在類創(chuàng)建的同時就實例化一個靜態(tài)對象出來,不管之后會不會使用這個單例,都會占據(jù)一定的內(nèi)存,但是相應(yīng)的,在第一次調(diào)用時速度也會更快,因為其資源已經(jīng)初始化完成,而懶漢式顧名思義,會延遲加載,在第一次使用該單例的時候才會實例化對象出來,第一次調(diào)用時要做初始化,如果要做的工作比較多,性能上會有些延遲,之后就和餓漢式一樣了。

單例一定就只會創(chuàng)建一個對象嗎?不一定。

如果有兩個類加載器加載了該單例類,則就可能會創(chuàng)建多個單例實例。

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

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

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI