日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

单例模式的五种写法

發(fā)布時(shí)間:2025/5/22 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单例模式的五种写法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、懶漢式,線程不安全
顧名思義就是實(shí)例在用到的時(shí)候才去創(chuàng)建,“比較懶”,用的時(shí)候才去檢查有沒(méi)有實(shí)例,如果有則返回,沒(méi)有則新建

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、餓漢式
餓漢式,從名字上也很好理解,就是“比較勤”,實(shí)例在初始化的時(shí)候就已經(jīng)建好了,不管你有沒(méi)有用到,都先建好了再說(shuō)。好處是沒(méi)有線程安全的問(wèn)題,壞處是浪費(fèi)內(nèi)存空間

public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){} public static Singleton getInstance() { return instance; } }

4、雙檢鎖/雙重校驗(yàn)鎖(DCL,即 double-checked locking)
雙檢鎖,又叫雙重校驗(yàn)鎖,綜合了懶漢式和餓漢式兩者的優(yōu)缺點(diǎn)整合而成??瓷厦娲a實(shí)現(xiàn)中,特點(diǎn)是在synchronized關(guān)鍵字內(nèi)外都加了一層 if 條件判斷,這樣既保證了線程安全,又比直接上鎖提高了執(zhí)行效率,還節(jié)省了內(nèi)存空間

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、登記式/靜態(tài)內(nèi)部類(lèi)
靜態(tài)內(nèi)部類(lèi)的方式效果類(lèi)似雙檢鎖,但實(shí)現(xiàn)更簡(jiǎn)單。但這種方式只適用于靜態(tài)域的情況,雙檢鎖方式可在實(shí)例域需要延遲初始化時(shí)使用

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、枚舉
枚舉的方式是比較少見(jiàn)的一種實(shí)現(xiàn)方式,但是看上面的代碼實(shí)現(xiàn),卻更簡(jiǎn)潔清晰。并且她還自動(dòng)支持序列化機(jī)制,絕對(duì)防止多次實(shí)例化

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("doSomething");}}public class Main {public static void main(String[] args) {Singleton.INSTANCE.doSomething();}}

好了,上面就是單例模式的五種主要寫(xiě)法。我們來(lái)總結(jié)下,一般情況下,懶漢式(包含線程安全和線程不安全梁總方式)都比較少用;餓漢式和雙檢鎖都可以使用,可根據(jù)具體情況自主選擇;在要明確實(shí)現(xiàn) lazy loading 效果時(shí),可以考慮靜態(tài)內(nèi)部類(lèi)的實(shí)現(xiàn)方式;若涉及到反序列化創(chuàng)建對(duì)象時(shí),大家也可以嘗試使用枚舉方式

總結(jié)

以上是生活随笔為你收集整理的单例模式的五种写法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。