单例模式(Java)
其他寫法的單例模式就不多說了,主要說下多線程并發(fā)執(zhí)行情況下的單例模式。
為了多線程安全,該單例模式使用了 "雙檢鎖",防止數(shù)據(jù)被破壞。
單例模式只有一個實(shí)例,節(jié)省了資源,提高了效率。
Double-Check概念對于多線程開發(fā)者來說不會陌生,如上述代碼中所示,我們進(jìn)行了兩次if (null == instance)的檢查,這樣就可以保證線程安全了。這樣,實(shí)例化代碼只用執(zhí)行一次,后面再次訪問時,判斷if (null == instance),直接return實(shí)例化對象。使用volatile的目的是為了instance對所有線程是“透明的”,instance被修改之后其他線程在訪問instance時會使用修改后的值,告訴VM從內(nèi)存中讀取該對象的值,這牽涉到線程的內(nèi)存模型,請參考我后續(xù)的博客講解內(nèi)存模型。
優(yōu)點(diǎn):線程安全;延遲加載;效率較高。
有兩個問題需要注意:
? 1、如果單例由不同的類裝載器裝入,那便有可能存在多個單例類的實(shí)例。假定不是遠(yuǎn)端存取,例如一些servlet容器對每個servlet使用完全不同的類? 裝載器,這樣的話如果有兩個servlet訪問一個單例類,它們就都會有各自的實(shí)例。
? 2、如果Singleton實(shí)現(xiàn)了java.io.Serializable接口,那么這個類的實(shí)例就可能被序列化和復(fù)原。不管怎樣,如果你序列化一個單例類的對象,接下來復(fù)原多個那個對象,那你就會有多個單例類的實(shí)例。
總結(jié)
以上是生活随笔為你收集整理的单例模式(Java)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018年易语言FPS骨骼方框透视辅助开
- 下一篇: java中Map集合的四种遍历方式