設(shè)計模式--單例模式1
介紹
單例模式的含義:單例模式,是一種常用的軟件設(shè)計模式。通過單例模式可以保證系統(tǒng)中, 應(yīng)用該模式的這個類永遠(yuǎn)只有一個實例。即一個類永遠(yuǎn)只有一個對象實例。單例是為了節(jié)約內(nèi)存,單例在有些業(yè)務(wù)場景下還必須用到??!
單例模式有八種方式:
餓漢式(靜態(tài)常量);
餓漢式(靜態(tài)代碼塊);
懶漢式(線程不安全);
懶漢式(線程安全,同步方法);
懶漢式(線程安全,同步代碼塊);
雙重檢查;
靜態(tài)內(nèi)部類;
枚舉
我在這里介紹常用的,有興趣的小伙伴可以一起探討
1.餓漢單例設(shè)計模式
懶加載(lazy loading):使?的時候再創(chuàng)建對象
2.懶漢單例設(shè)計模式
這種?式在單線程下使?沒有問題,對于多線程是?法保證單例的,這?列出來是為了和后?使?鎖保證線程安全的單例做對?。
懶漢式,線程不安全
優(yōu)點:懶加載
缺點:線程不安全
多線程破壞單例
效果:

3.雙檢鎖/雙重校驗鎖(DCL,即 double-checked locking)
描述:這種方式采用雙鎖機制,安全且在多線程情況下能保持高性能。getInstance() 的性能對應(yīng)用程序很關(guān)鍵。
4.登記式/靜態(tài)內(nèi)部類
描述:這種方式能達(dá)到雙檢鎖方式一樣的功效,但實現(xiàn)更簡單。對靜態(tài)域使用延遲初始化,應(yīng)使用這種方式而不是雙檢鎖方式。這種方式只適用于靜態(tài)域的情況,雙檢鎖方式可在實例域需要延遲初始化時使用。
5.枚舉
描述:這種實現(xiàn)方式還沒有被廣泛采用,但這是實現(xiàn)單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。這種方式是 Effective Java 作者 Josh Bloch 提倡的方式,它不僅能避免多線程同步問題,而且還自動支持序列化機制,防止反序列化重新創(chuàng)建新的對象,絕對防止多次實例化。不過,由于 JDK1.5 之后才加入 enum 特性,用這種方式寫不免讓人感覺生疏,在實際工作中,也很少用。不能通過 reflection attack 來調(diào)用私有構(gòu)造方法。