关于Java单例模式的思考
起因
最近找工作被面試官問到了設計模式方面的問題,而我一直只會寫點簡單的代碼,從來沒認真學過啥設計模式,然后氣氛直接就尷尬了。。。
隨后急中生智,以前看別人代碼 getInstance用的挺多的,應該是叫單例模式吧。所以就回答單例模式。
追問1: 如何解決單例模式的線程安全問題?
好吧,又是一個知識盲區,但是線程安全問題肯定要加鎖啊,感覺這一問應該是可以糊弄過去。
追問2: 有沒有更好的辦法?
這一問把我問沉默了,當時確實第一次面試,有點緊張,所以沒有答上來。后來一想,這問題真是TTM簡單了好吧。我不把實例化過程放在運行時不就好了,一開始實例化好了不就不用再考慮多線程重復實例化了?然而當時因為緊張,沒有說出來。
但是后來一想,然后看了一些單例模式的資料后,發現對這個單例有一些自己的想法。
關于餓漢 單例模式
不知道為什么,人們普遍把一開始就實例化的單例模式叫餓漢模式,可能是因為JVM太餓了,不管用不用的上,先實例化一個再說。
餓漢單例模式確實比加鎖的懶漢模式在多線程的時候表現更好一些,但是
疑問1: 會不會存在整個運行過程中不調用該實例,而使餓漢模式不由分說直接實例化的行為變成一種對資源的浪費的情況?
也就是說:你實例化那么早干什么,我還沒說要不要用你呢,你杵在那干啥,凈占地方!
疑問2: 存不存在要求單例可定制的情況?有沒有必要出現一種“多例”模式?
單例解決的是在多個不同地方對同一個類的調用時,該類重復實例化的問題。默認這個類實例化的時候是不傳遞構造參數的,也就是說 單例模式的實例不可定制。這保證了類可以一開始就 public static instance = new Class,但是同時也限制了自由。
比如一種場景:
我要建立一個Table類,它從單個文件中加載一些數據,然后供其它對象調用。但是實際上數據很多,分了好多文件保存,而我每一次運行時只需要查詢其中幾個個文件的數據,如果有這種情況,我應該如何用單例模式做到?
設想:多例模式?
對此我就想,可不可以用一種結構實現更靈活的可定制的“多例”模式?
即:在類中維持一個實例集合,這個集合中有多個實例,每個實例有一個Key索引。比如我要查詢第4個文件的數據,則調用 getInstance(4),如果發現沒有相應實例,則Table類在實例集合中實例化一個構造參數為4個Table對象。如此實現一個類似于緩沖的效果?
一個類根據不同參數,產生多個不同的實例,以適應不同的調用。在保證只有同一個類的基礎上,實現實例的多樣化和自動管理。
這個多例模式我覺得是挺可行的,剛學設計模式,或許應該有更好的辦法可以解決上面說道的Table的問題,或許我這個Table情景只是極特殊情況,根本沒有實際價值。。。
PS:好吧,繼續學習后發現,其實已經有多例模式了,我能想到的人家早就想到了,還想得比我完善[淚],看完不要罵我。
總結
以上是生活随笔為你收集整理的关于Java单例模式的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全局安装vue-cli以及初始化
- 下一篇: 多视几何