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