關(guān)于單例模式鹊碍,我想大多數(shù)都知道單例很有用厌殉,很多時候我們用單例來實現(xiàn)的就是在多個界面都用到一個實例對象的時候,不需要重新new和初始化侈咕,賦值一系列操作公罕。除此之外還有一些工具類什么的,像圖片加載的工具類通常都會耗費一定的緩存空間耀销,要是反復(fù)創(chuàng)建這些對象想想就知道多么的可怕楼眷。
普通單例
之所以叫做懶漢只是因為instance只有在真正需要的時候,調(diào)用getInstance()獲取實例時才會new一個對象熊尉。但可能會出現(xiàn)的問題是在多線程中罐柳,可能會new出兩個對象,然后對instance進行了兩次覆蓋狰住,不過其實實戰(zhàn)中這種情況發(fā)生的幾率并不高张吉,而且影響一般很小。所以要是使用的時候完全不會出現(xiàn)多線程的問題的話催植,毫無疑問這是最好的方法。
雙重校驗鎖
我想很多人包括我自己常用的都是這一種方法來實現(xiàn)單例模式创南,因為這種方法既能避免線程安全問題伦忠,而且還能最大限度減少對性能的影響(每次對對象上鎖性能都會有所下降)。
靜態(tài)內(nèi)部類
這種方法看起來比較繞稿辙,主要是利用了classloder的機制來保證初始化instance時只有一個線程缓苛。使用和理解都比其它的要困難,建議使用枚舉或者雙重校驗鎖的方式。
枚舉
據(jù)說不少的公司都有人嘗試使用這種方法未桥,因為不僅這種方法既可以避免線程安全問題笔刹,而且還能防止反序列化重新創(chuàng)建新的對象。
大多數(shù)時候我們使用單例的目的也很單純冬耿,所以哪一種順手就用哪一種吧