生活随笔
收集整理的這篇文章主要介紹了
单例模式的五种写法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、懶漢式,線程不安全 顧名思義就是實例在用到的時候才去創建,“比較懶”,用的時候才去檢查有沒有實例,如果有則返回,沒有則新建
public class Singleton {private static Singleton instance;private Singleton (){}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
2、懶漢式,線程安全
public class Singleton { private static Singleton instance; private Singleton (){} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; }
}
3、餓漢式 餓漢式,從名字上也很好理解,就是“比較勤”,實例在初始化的時候就已經建好了,不管你有沒有用到,都先建好了再說。好處是沒有線程安全的問題,壞處是浪費內存空間
public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; }
}
4、雙檢鎖/雙重校驗鎖(DCL,即 double-checked locking) 雙檢鎖,又叫雙重校驗鎖,綜合了懶漢式和餓漢式兩者的優缺點整合而成。看上面代碼實現中,特點是在synchronized關鍵字內外都加了一層 if 條件判斷,這樣既保證了線程安全,又比直接上鎖提高了執行效率,還節省了內存空間
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; }
}
5、登記式/靜態內部類 靜態內部類的方式效果類似雙檢鎖,但實現更簡單。但這種方式只適用于靜態域的情況,雙檢鎖方式可在實例域需要延遲初始化時使用
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; }
}
6、枚舉 枚舉的方式是比較少見的一種實現方式,但是看上面的代碼實現,卻更簡潔清晰。并且她還自動支持序列化機制,絕對防止多次實例化
public enum Singleton {INSTANCE;public void doSomething() {System.out.println("doSomething");}}public class Main {public static void main(String[] args) {Singleton.INSTANCE.doSomething();}}
好了,上面就是單例模式的五種主要寫法。我們來總結下,一般情況下,懶漢式(包含線程安全和線程不安全梁總方式)都比較少用;餓漢式和雙檢鎖都可以使用,可根據具體情況自主選擇;在要明確實現 lazy loading 效果時,可以考慮靜態內部類的實現方式;若涉及到反序列化創建對象時,大家也可以嘗試使用枚舉方式
總結
以上是生活随笔 為你收集整理的单例模式的五种写法 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。