最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java  設(shè)計(jì)模式之單例模式

 更新時(shí)間:2017年02月19日 11:49:38   作者:ionetwogo  
這篇文章主要介紹了java 設(shè)計(jì)模式之單例模式的相關(guān)資料,需要的朋友可以參考下

java  設(shè)計(jì)模式之單例模式

前言:

在軟件開(kāi)發(fā)過(guò)程中常會(huì)有一些對(duì)象我們只需要一個(gè),如:線程池(threadpool)、緩存(cache)、對(duì)話框、偏好設(shè)置等。這些對(duì)象如果制造出多個(gè)實(shí)例的話可能會(huì)導(dǎo)致一些不必要的麻煩,如:程序行為異常、資源使用過(guò)量等。這時(shí)單例模式就可以確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供全局訪問(wèn)點(diǎn)。下面是從簡(jiǎn)單的單例類(lèi)來(lái)探討該用何種方法實(shí)現(xiàn)單例模式。

/**
 * 最經(jīng)典的單例類(lèi)
 */
public class Singleton {
  // 設(shè)置成靜態(tài)變量來(lái)記錄Singleton的唯一實(shí)例
  private static Singleton singleInstance;
  private Singleton(){
    // 構(gòu)造方法聲明為私有的,這樣只能在Singleton類(lèi)中才能調(diào)用此構(gòu)造方法
  }
  /*
   * 獲取Singleton對(duì)象,如果還未實(shí)例化則實(shí)例化一個(gè)對(duì)象并返回這個(gè)實(shí)例
   */
  public static Singleton getInstance(){
    if (singleInstance == null) {
      singleInstance = new Singleton();
    }
    return singleInstance;
  }
  // 其他方法
}

從上面的例子可以看出Singleton類(lèi)自己管理這個(gè)類(lèi)的實(shí)例化過(guò)程,而且提供了全局訪問(wèn)點(diǎn),就是設(shè)置成靜態(tài)的getInstance()方法,在其他類(lèi)要使用Singleton時(shí)它會(huì)返回一個(gè)實(shí)例。這中單例模式有個(gè)優(yōu)點(diǎn)就是延遲實(shí)例化,簡(jiǎn)單地說(shuō)延遲實(shí)例化就是延遲初始化,在類(lèi)需要時(shí)才創(chuàng)建其實(shí)例,而不是在開(kāi)始加載這個(gè)類(lèi)時(shí)就創(chuàng)建出一個(gè)實(shí)例,這樣的好處是可以避免性能的浪費(fèi)。例如有些對(duì)象無(wú)需程序一開(kāi)始就使用,或者其在程序執(zhí)行的過(guò)程中就沒(méi)有使用過(guò)。但是此例子卻又一個(gè)缺點(diǎn),那就是線程不夠安全。因?yàn)槿绻卸鄠€(gè)線程同時(shí)執(zhí)行到getInstance()方法,而Singleton又還未new Singleton()一個(gè)實(shí)例,那么線程就會(huì)都認(rèn)為singleInstance為null,就都會(huì)實(shí)例化Singleton,這時(shí)就會(huì)產(chǎn)生多個(gè)Singleton實(shí)例,明顯不符合單例模式的初衷。那么接下來(lái)可能要做的就是對(duì)其進(jìn)行改進(jìn)

public class SingletonA {
  private static SingletonA singletongA;
  private SingletonA(){

  }
  /*
   * 增加synchronized關(guān)鍵字把getSingletonA方法變?yōu)橥椒椒?
   */
  public static synchronized SingletonA getInstanceA(){
    if (singletongA == null) {
      singletongA = new SingletonA();
    }
    return singletongA;
  }
  // 其他方法
}

從這個(gè)例子上看增加了synchronized可以使getInstanceA()變成一個(gè)同步的方法,這時(shí)線程在進(jìn)入這個(gè)方法之前就需要等待其他線程離開(kāi)這個(gè)方法才能進(jìn)入,也就使得該方法只能同時(shí)存在一個(gè)線程在執(zhí)行它。

可能差不多問(wèn)題解決了,但是要知道同步方法是會(huì)影響程序執(zhí)行效率的,在此例子中我們只是為了解決第一個(gè)例子中第一次執(zhí)行g(shù)etInstance()方法不會(huì)產(chǎn)生多個(gè)實(shí)例,而這個(gè)例子中卻會(huì)導(dǎo)致每次需要實(shí)例時(shí)都會(huì)調(diào)用getInstanceA()同步方法,而在已經(jīng)有實(shí)例之后的調(diào)用synchronized就會(huì)是累贅,因?yàn)槲覀円呀?jīng)無(wú)需擔(dān)心這個(gè)單例類(lèi)會(huì)再次被創(chuàng)建出新的實(shí)例。因此我們還需要做一下改進(jìn)。

既然上面說(shuō)到延遲實(shí)例化,那么如果是不用的話那就簡(jiǎn)單多了。

public class SingletonB {
  // 在靜態(tài)初始化器(static initializen)中創(chuàng)建單例,保證線程安全
  private static SingletonB singletonB = new SingletonB();
  private SingletonB(){
    // 構(gòu)造函數(shù)
  }
  public static SingletonB getInstaceB(){
    // 已經(jīng)實(shí)例化了,直接使用它
    return singletonB;
  }
}

上面的這種做法是在JVM加載這個(gè)類(lèi)時(shí)馬上創(chuàng)建一個(gè)實(shí)例,因?yàn)镴VM會(huì)在線程訪問(wèn)這個(gè)實(shí)例之前就創(chuàng)建出該實(shí)例,因此線程是安全的。但這相較于延遲實(shí)例化而言可能會(huì)出現(xiàn)資源的浪費(fèi)。而且如果此類(lèi)較大的情況下會(huì)時(shí)程序初始化時(shí)間加長(zhǎng)。

那么是否可以在使用用延遲實(shí)例化的同時(shí)又不會(huì)造成線程不安全且增加訪問(wèn)效率呢。接下來(lái)就用雙重檢查加鎖來(lái)改進(jìn)一下。

/**
 * 雙重鎖單例模式
 */
public class SingletonC {
  private volatile static SingletonC singletonC;
  private SingletonC(){

  }
  public static SingletonC getInstanceC(){
    if (singletonC == null) {
      synchronized (SingletonC.class) {
        if (singletonC == null) {
          singletonC = new SingletonC();
        }
      }
    }
    return singletonC;
  }
}

上面的例子是先檢查實(shí)例,如果不存在則進(jìn)入同步區(qū)塊,進(jìn)入同步區(qū)塊之后再次檢查,如果還是null才會(huì)創(chuàng)建實(shí)例,因而singletonC = new SingletonC()只會(huì)執(zhí)行一次,而之后調(diào)用getInstanceC()時(shí)就因?yàn)橛袑?shí)例直接返回,所以除了第一次調(diào)用時(shí)會(huì)走同步,而之后便不會(huì)如第二個(gè)例子那樣每次都會(huì)走同步方法。這樣就可以使得執(zhí)行g(shù)etInstanceC()的時(shí)間減少。想必這里會(huì)發(fā)現(xiàn)有個(gè)volatile關(guān)鍵字,其作用是使得singletonC被初始化后對(duì)所有線程可見(jiàn),多個(gè)線程可以正確地處理這個(gè)SingletonC變量。但要注意的:volatile關(guān)鍵字只能在Java 5及其之后使用,如果在此版本之前會(huì)導(dǎo)致這個(gè)雙重檢查失效。

在使用單例模式時(shí),如果有多個(gè)類(lèi)加載器(classloader)時(shí)需要自行指定類(lèi)加載器,并指定用一個(gè)類(lèi)加載器。因?yàn)槊總€(gè)類(lèi)加載器都定義了一個(gè)命名空間,不同的類(lèi)加載器可能會(huì)加載同一個(gè)類(lèi),從而導(dǎo)致單例類(lèi)創(chuàng)建出多個(gè)實(shí)例。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

  • Java高并發(fā)下鎖的優(yōu)化詳解

    Java高并發(fā)下鎖的優(yōu)化詳解

    這篇文章主要介紹了Java高并發(fā)下鎖的優(yōu)化詳解,鎖是最常用的同步方法之一,在高并發(fā)的環(huán)境下,激烈的鎖競(jìng)爭(zhēng)會(huì)導(dǎo)致程序的性能下降,下面是一些關(guān)于鎖的使用建議,可以把這種副作用降到最低,需要的朋友可以參考下
    2024-01-01
  • maven中更改jdk版本的方法實(shí)現(xiàn)

    maven中更改jdk版本的方法實(shí)現(xiàn)

    本文主要介紹了maven中更改jdk版本的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程

    使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程

    本文給大家分享使用Spring Boot實(shí)現(xiàn)操作數(shù)據(jù)庫(kù)的接口的過(guò)程,包括springboot原理解析及實(shí)例代碼詳解,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • SpringBoot中忽略實(shí)體類(lèi)中的某個(gè)屬性不返回給前端的方法(示例詳解)

    SpringBoot中忽略實(shí)體類(lèi)中的某個(gè)屬性不返回給前端的方法(示例詳解)

    本文介紹了在Spring Boot中使用Jackson和Fastjson忽略實(shí)體類(lèi)屬性不返回給前端的方法,在Jackson中,同時(shí)使用@JsonProperty和@JsonIgnore時(shí),@JsonIgnore可能失效,Fastjson中可以使用@JSONField(serialize=false)來(lái)實(shí)現(xiàn),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2024-11-11
  • Java實(shí)戰(zhàn)之課程在線學(xué)習(xí)系統(tǒng)的實(shí)現(xiàn)

    Java實(shí)戰(zhàn)之課程在線學(xué)習(xí)系統(tǒng)的實(shí)現(xiàn)

    本文將采用SpringBoot+Spring+Mybatis+Thyeleaf實(shí)現(xiàn)一個(gè)課程在線學(xué)習(xí)系統(tǒng),采用SpringBoot框架實(shí)現(xiàn)?前臺(tái)模板用的thymeleaf數(shù)據(jù)庫(kù)層采用mybatis框架注解模式,感興趣的可以了解一下
    2022-04-04
  • Java獲取手機(jī)號(hào)碼歸屬地的實(shí)現(xiàn)

    Java獲取手機(jī)號(hào)碼歸屬地的實(shí)現(xiàn)

    這篇文章主要介紹了Java獲取手機(jī)號(hào)碼歸屬地的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaWeb如何實(shí)現(xiàn)禁用瀏覽器緩存

    JavaWeb如何實(shí)現(xiàn)禁用瀏覽器緩存

    這篇文章主要介紹了JavaWeb如何實(shí)現(xiàn)禁用瀏覽器緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 示例解析java面向?qū)ο缶幊谭庋b與訪問(wèn)控制

    示例解析java面向?qū)ο缶幊谭庋b與訪問(wèn)控制

    這篇文章主要為大家介紹了java封裝與訪問(wèn)控制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 最新評(píng)論

    双流县| 浙江省| 博兴县| 南宫市| 宣恩县| 澄迈县| 谢通门县| 汉阴县| 三门县| 穆棱市| 贵州省| 荥经县| 邯郸县| 宜城市| 湄潭县| 惠安县| 昌乐县| 彩票| 闸北区| 同江市| 任丘市| 鄂州市| 绵阳市| 南部县| 互助| 梁山县| 六枝特区| 天峻县| 盖州市| 北辰区| 黑山县| 新晃| 万荣县| 泰安市| 泗阳县| 汝南县| 新巴尔虎右旗| 腾冲县| 保靖县| 永吉县| 安宁市|