大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Java設(shè)計(jì)單例模式你用對(duì)了嗎?


單例模式是設(shè)計(jì)模式中相對(duì)簡(jiǎn)單的,只有一個(gè)單例類(lèi),沒(méi)有其他的層次結(jié)構(gòu)與抽象。該模式需要確保該類(lèi)只能生成一個(gè)對(duì)象,通常是該類(lèi)需要消耗太多的資源或者沒(méi)有沒(méi)有多個(gè)實(shí)例的理由。程序員在Java模式設(shè)計(jì)的時(shí)候應(yīng)該如何更好地使用單例模式呢?本文動(dòng)力節(jié)點(diǎn)的老師就為大家詳解一下單例模式,希望對(duì)大家有用。

為何需要單例模式

對(duì)于系統(tǒng)中的某些類(lèi)來(lái)說(shuō),只有一個(gè)實(shí)例很重要,例如,一個(gè)系統(tǒng)只能有一個(gè)窗口管理器或文件系統(tǒng);一個(gè)系統(tǒng)只能有一個(gè)計(jì)時(shí)工具或ID(序號(hào))生成器。

單例模式設(shè)計(jì)要點(diǎn)

保證該類(lèi)只有一個(gè)實(shí)例。將該類(lèi)的構(gòu)造方法定義為私有方法,這樣其他處的代碼就無(wú)法通過(guò)調(diào)用該類(lèi)的構(gòu)造方法來(lái)實(shí)例化該類(lèi)的對(duì)象,提供一個(gè)該實(shí)例的訪(fǎng)問(wèn)點(diǎn)。一般由該類(lèi)自己負(fù)責(zé)創(chuàng)建實(shí)例,并提供一個(gè)靜態(tài)方法作為該實(shí)例的訪(fǎng)問(wèn)點(diǎn)。

餓漢 vs. 懶漢

餓漢 聲明實(shí)例引用時(shí)即實(shí)例化

懶漢 靜態(tài)方法第一次被調(diào)用前不實(shí)例化,也即懶加載。對(duì)于創(chuàng)建實(shí)例代價(jià)大,且不定會(huì)使用時(shí),使用懶加載模式可以減少開(kāi)銷(xiāo)。

實(shí)現(xiàn)單例模式的九種方法

線(xiàn)程不安全的懶漢 - 多線(xiàn)程不可用

package com.jasongj.singleton1;

public class Singleton {

  private static Singleton INSTANCE;

  private Singleton() {};

  public static Singleton getInstance() {

    if (INSTANCE == null) {

      INSTANCE = new Singleton();

    }

    return INSTANCE;

  }

}

優(yōu)點(diǎn):達(dá)到了Lazy Loading的效果

缺點(diǎn):只有在單線(xiàn)程下能保證只有一個(gè)實(shí)例,多線(xiàn)程下有創(chuàng)建多個(gè)實(shí)例的風(fēng)險(xiǎn)

同步方法下的懶漢 - 可用,不推薦

package com.jasongj.singleton2;

public class Singleton {

  private static Singleton INSTANCE;

  private Singleton() {};

  public static synchronized Singleton getInstance() {

    if (INSTANCE == null) {

      INSTANCE = new Singleton();

    }

    return INSTANCE;

  }

}

優(yōu)點(diǎn):線(xiàn)程安全,可確保正常使用下(不考慮通過(guò)反射調(diào)用私有構(gòu)造方法)只有一個(gè)實(shí)例

缺點(diǎn):每次獲取實(shí)例都需要申請(qǐng)鎖,開(kāi)銷(xiāo)大,效率低

同步代碼塊下的懶漢 - 不可用

package com.jasongj.singleton3;

public class Singleton {

  private static Singleton INSTANCE;

  private Singleton() {};

  public static Singleton getInstance() {

    if (INSTANCE == null) {

      synchronized (Singleton.class) {

        INSTANCE = new Singleton();

      }

    }

    return INSTANCE;

  }

}

優(yōu)點(diǎn):不需要在每次調(diào)用時(shí)加鎖,效率比上一個(gè)高

缺點(diǎn):雖然使用了synchronized,但本質(zhì)上是線(xiàn)程不安全的。

不正確雙重檢查(Double Check)下的懶漢 - 不推薦

package com.jasongj.singleton4;

public class Singleton {

  private static Singleton INSTANCE;

  private Singleton() {};

  public static Singleton getInstance() {

    if (INSTANCE == null) {

      synchronized(Singleton.class){

        if(INSTANCE == null) {

          INSTANCE = new Singleton();

        }

      }

    }

    return INSTANCE;

  }

}

優(yōu)點(diǎn):使用了雙重檢查,很大程度上避免了線(xiàn)程不安全,同時(shí)也避免了不必要的鎖開(kāi)銷(xiāo)

缺點(diǎn):依然存在創(chuàng)建多個(gè)實(shí)例的可能。因?yàn)槊總€(gè)線(xiàn)程都有自己的一份拷貝,并不能保證實(shí)例化后將INSTANCE的引用拷回主內(nèi)存,不能保證對(duì)其它線(xiàn)程立即可見(jiàn),所以仍然有可能造成多個(gè)實(shí)例被創(chuàng)建

正確雙重檢查(Double Check)下的懶漢 - 推薦

package com.jasongj.singleton5;

public class Singleton {

  private static volatile Singleton INSTANCE;

  private Singleton() {};

  public static Singleton getInstance() {

    if (INSTANCE == null) {

      synchronized (Singleton.class) {

        if (INSTANCE == null) {

          INSTANCE = new Singleton();

        }

      }

    }

    return INSTANCE;

  }

}

優(yōu)點(diǎn):使用了雙重檢查,同時(shí)使用volatile修飾INSTANCE,避免由于多線(xiàn)性同步和可見(jiàn)性問(wèn)題造成的多實(shí)例

缺點(diǎn):NA

靜態(tài)常量 餓漢 - 推薦

package com.jasongj.singleton6;

public class Singleton {

  private static final Singleton INSTANCE = new Singleton();

  private Singleton() {};

  public static Singleton getInstance() {

    return INSTANCE;

  }

}

優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,無(wú)線(xiàn)程同步問(wèn)題

缺點(diǎn):在類(lèi)裝載時(shí)完成實(shí)例化。若該實(shí)例一直未被使用,則會(huì)造成資源浪費(fèi)

靜態(tài)代碼塊 餓漢 可用

package com.jasongj.singleton7;

public class Singleton {

  private static Singleton INSTANCE;

  static{

    INSTANCE = new Singleton();

  }

  private Singleton() {};

  public static Singleton getInstance() {

    return INSTANCE;

  }

}

優(yōu)點(diǎn):無(wú)線(xiàn)程同步問(wèn)題

缺點(diǎn):類(lèi)裝載時(shí)創(chuàng)建實(shí)例,無(wú)Lazy Loading。實(shí)例一直未被使用時(shí),會(huì)浪費(fèi)資源

靜態(tài)內(nèi)部類(lèi) 推薦

package com.jasongj.singleton8;

public class Singleton {

  private Singleton() {};

  public static Singleton getInstance() {

    return InnerClass.INSTANCE;

  }

  private static class InnerClass {

    private static final Singleton INSTANCE = new Singleton();

  }

}

優(yōu)點(diǎn):無(wú)線(xiàn)程同步問(wèn)題,實(shí)現(xiàn)了懶加載(Lazy Loading)。因?yàn)橹挥姓{(diào)用getInstance時(shí)才會(huì)裝載內(nèi)部類(lèi),才會(huì)創(chuàng)建實(shí)例

缺點(diǎn):NA

枚舉 不推薦

package com.jasongj.singleton9;

public enum Singleton {

  INSTANCE;

  public void whatSoEverMethod() { }

}

優(yōu)點(diǎn):無(wú)線(xiàn)程同步問(wèn)題,且能防止通過(guò)反射創(chuàng)建新的對(duì)象

缺點(diǎn):使用的是枚舉,而非類(lèi)。同時(shí)單一實(shí)例的訪(fǎng)問(wèn)點(diǎn)也不是一般單例模式的靜態(tài)方法

以上就是動(dòng)力節(jié)點(diǎn)的Java講師為大家介紹的Java單例模式的使用方法和推薦實(shí)現(xiàn)單例模式的九種方法,相信能對(duì)你的學(xué)習(xí)有啟發(fā)。

 

上一篇:多參與開(kāi)源的好處
下一篇:Java培訓(xùn)都需要學(xué)習(xí)哪些課程

開(kāi)班信息

主站蜘蛛池模板: 久草最新网址 | 亚洲欧美日韩v中文在线 | 免费的黄色小视频 | 很黄的视频网站 | 中文字幕亚洲第一 | 欧美日韩一区二区视频免费看 | 波多野吉衣一区二区三区四区 | 狠狠综合久久 | 国产成人综合网在线观看 | 精品人人 | 亚洲九九香蕉 | 国产日产亚洲精品 | 亚洲一区毛片 | 久久爱伊人一区二区三区小说 | 91啦丨国产丨 | 免费一级毛片在播放视频 | 日韩国产一区二区 | 欧美一级毛片日韩一级 | 草草操 | 91福利视频免费观看 | 成人做爰毛片免费视频 | 俄罗斯午夜影院 | 久久精品啪啪嗷嗷叫 | 日日摸天天添天天添破 | 香蕉在线网站 | 国产精品白丝喷水在线观看 | 99在线观看视频免费 | 欧美一级毛片免费网站 | 欧美亚洲三级 | 狠狠操天天操 | 九草伊人 | 伊人爱爱网 | 色婷婷婷丁香亚洲综合不卡 | 国产精品永久免费视频 | 动漫精品欧美一区二区三区 | 国产中日韩一区二区三区 | 日韩精品一区二区在线观看 | bbw满足护士 | 久久免费资源福利资源站 | 四虎永久免费观看紧急入口 | 91国内精品久久久久怡红院 |