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

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

 更新時(shí)間:2017年10月18日 10:53:37   作者:WAUANG  
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之單例模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

單例模式也叫做單肩模式,也是一種創(chuàng)建型模式,是我們?nèi)粘i_(kāi)發(fā)中最常使用的一種設(shè)計(jì)模式,經(jīng)常被用來(lái)封裝一些工具類,例如數(shù)據(jù)庫(kù)連接等。

單例模式的定義:

單例模式,是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例的特殊類。通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例。即一個(gè)類只有一個(gè)對(duì)象實(shí)例

單例模式分為以下幾種:
①餓漢單例模式
②懶漢單例模式
③IoDH單例模式
④枚舉單例模式

下面我們一一的進(jìn)行介紹:

1.首先是餓漢單例模式,顧名思義“餓漢”,代表急著“吃飯”(這里的飯應(yīng)該是指的實(shí)例對(duì)象),所以很早就創(chuàng)建出來(lái)。不多說(shuō),上代碼:

package singleton;

public class HungrySingletonP {
  private static HungrySingletonP instance=new HungrySingletonP();

  public HungrySingletonP(){}

  public static HungrySingletonP getInstance(){
    return instance;
  }
}

這段代碼很形象的體現(xiàn)了餓漢模式。

這種方法在類加載的時(shí)候就已經(jīng)實(shí)例化了(只創(chuàng)建唯一的實(shí)例),所以不存在線程上的一些問(wèn)題。但是,也因?yàn)槿绱巳绻刑嗟膯卫?,且這些實(shí)例不經(jīng)常使用那么久會(huì)造成對(duì)內(nèi)存的浪費(fèi)。

2.懶漢模式,同樣什么叫做懶漢模式?一個(gè)懶惰的人,只有去吃飯的時(shí)候才會(huì)去刷碗(昨天用過(guò)的臟碗),即:只有當(dāng)用到對(duì)象的時(shí)候才去創(chuàng)建對(duì)象,來(lái)上代碼:

package singleton;

public class LasySingletonV1 {
  private static LasySingletonV1 instance;

  public LasySingletonV1(){}

  public static LasySingletonV1 getInstance(){
    if(instance==null){
      return new LasySingletonV1();
    }else
      return instance;
  }
}

上面的這段代碼是懶漢模式,當(dāng)我們不需要實(shí)例的時(shí)候,它不會(huì)創(chuàng)建實(shí)例,只有需要實(shí)例的時(shí)候,才會(huì)創(chuàng)建,節(jié)省空間。
但是,我們不推薦使用,因?yàn)槲覀冊(cè)瓉?lái)的設(shè)計(jì)理念是:當(dāng)需要的時(shí)候(并且instance為空)創(chuàng)建實(shí)例,當(dāng)已經(jīng)創(chuàng)建過(guò)后,如果還需要實(shí)例,則判斷instance是否為空,因?yàn)榍斑呉呀?jīng)創(chuàng)建過(guò)了,不為空,所以直接返回之前已經(jīng)創(chuàng)建的實(shí)例。
以上的想法是很好的,但是它是線程不安全的。因?yàn)椋寒?dāng)有多個(gè)線程同時(shí)調(diào)用這個(gè)方法時(shí),因?yàn)橥瑫r(shí)判斷實(shí)例為空,所以會(huì)創(chuàng)建很多個(gè)實(shí)例,這不符合單例模式的設(shè)計(jì)理念(一個(gè)類只有一個(gè)實(shí)例對(duì)象)。

所以我們需要對(duì)它進(jìn)行改進(jìn),因?yàn)樗鼤?huì)異步創(chuàng)建多個(gè)實(shí)例,多以我們很容易就能想到,在getInstance方法之前加上synchronized進(jìn)行同步:

package singleton;

public class LasySingletonV2 {
  private static LasySingletonV2 instance;

  public LasySingletonV2(){}

  public synchronized LasySingletonV2 getInstance(){

    if(instance==null){
      return new LasySingletonV2();
    }else
      return instance;
  }
}

上面這樣,就不會(huì)創(chuàng)建多個(gè)實(shí)例對(duì)象符合單例模式的概念。

但是上面這樣的設(shè)計(jì)使得我們每次需要目標(biāo)實(shí)例的時(shí)候都要排隊(duì)等待,假設(shè)有很多線程都在調(diào)用這個(gè)getInstance方法,那么就會(huì)陷入很長(zhǎng)時(shí)間的等待,大大降低的程序的效率。

所以我們還要對(duì)程序進(jìn)行一定的修改,如果我們創(chuàng)建一個(gè)

package singleton;

public class LasySingletonV3 {
  private static LasySingletonV1 instance;

  public LasySingletonV3(){}

  public LasySingletonV3 getInstance(){
    if(instance==null){
      synchronized(LasySingletonV3.class){
        if(instance==null){
          return new LasySingletonV3();
        }
      }
    }
    return instance;
  }
}

以上的方法是懶漢模式的完整版本,我們來(lái)仔細(xì)分析一下:

當(dāng)有多個(gè)線程第一次調(diào)用這個(gè)方法的時(shí)候,都滿足instance為空,來(lái)到下一步,先獲得鎖的線程進(jìn)入下一步繼續(xù)判斷是否為空,為空,然后創(chuàng)建實(shí)例返回實(shí)例。

沒(méi)有獲得鎖的線程一直等待到獲得鎖的線程釋放鎖,當(dāng)在等待的線程獲得鎖的時(shí)候進(jìn)入下一步,還要進(jìn)行判斷instance是否為空,但是這個(gè)時(shí)候instance已經(jīng)不為空了,因?yàn)榍懊娴木€程已經(jīng)創(chuàng)建了實(shí)例,所以返回已經(jīng)創(chuàng)建好的實(shí)例。

以上是第一批調(diào)用getInstance方法的線程,當(dāng)后續(xù)的線程調(diào)用這個(gè)方法的時(shí)候就不用進(jìn)行鎖的獲取了和釋放了,因?yàn)榈谝徊揭呀?jīng)判斷instance不為空,直接返回instance實(shí)例。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring bean生命周期配置過(guò)程解析

    Spring bean生命周期配置過(guò)程解析

    這篇文章主要介紹了Spring bean生命周期配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java中的靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造方法詳解

    java中的靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造方法詳解

    下面小編就為大家?guī)?lái)一篇java中的靜態(tài)代碼塊、構(gòu)造代碼塊、構(gòu)造方法詳解。小編覺(jué)得挺好的,現(xiàn)在分享給大家。給大家一個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-03-03
  • 詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用

    詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用

    這篇文章主要介紹了詳解RabbitMQ中延遲隊(duì)列結(jié)合業(yè)務(wù)場(chǎng)景的使用,延遲隊(duì)列中的元素都是帶有時(shí)間屬性的,延遲隊(duì)列就是用來(lái)存放需要在指定時(shí)間被處理的元素的隊(duì)列,需要的朋友可以參考下
    2023-05-05
  • Hibernate延遲加載技術(shù)詳解

    Hibernate延遲加載技術(shù)詳解

    這篇文章主要介紹了Hibernate延遲加載技術(shù),結(jié)合實(shí)例形式詳細(xì)分析了Hibernate延遲加載所涉及的各種常用技巧,需要的朋友可以參考下
    2016-03-03
  • java實(shí)現(xiàn)網(wǎng)頁(yè)驗(yàn)證碼功能

    java實(shí)現(xiàn)網(wǎng)頁(yè)驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)網(wǎng)頁(yè)驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • springboot配置嵌入式servlet容器的方法

    springboot配置嵌入式servlet容器的方法

    這篇文章主要介紹了springboot配置嵌入式servlet容器的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java程序連接數(shù)據(jù)庫(kù)的常用的類和接口介紹

    Java程序連接數(shù)據(jù)庫(kù)的常用的類和接口介紹

    這篇文章主要介紹了Java程序連接數(shù)據(jù)庫(kù)的常用的類和接口,包括Connection類和Statement類等,需要的朋友可以參考下
    2015-10-10
  • 一文帶你搞懂SpringBoot中自動(dòng)裝配原理

    一文帶你搞懂SpringBoot中自動(dòng)裝配原理

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中自動(dòng)裝配原理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2025-01-01
  • 一文帶你全面了解Java?Hashtable

    一文帶你全面了解Java?Hashtable

    HashTable是jdk?1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會(huì)在面試中經(jīng)常被問(wèn)到。本文就來(lái)帶大家一起深入了解一下Hashtable,需要的可以參考一下
    2022-09-09
  • Scala入門之List使用詳解

    Scala入門之List使用詳解

    這篇文章主要介紹了Scala入門之List使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

镇沅| 交城县| 台湾省| 鹤岗市| 五大连池市| 苗栗县| 眉山市| 英山县| 郑州市| 屏东县| 广昌县| 雷山县| 高青县| 文山县| 徐州市| 绥宁县| 大城县| 富宁县| 藁城市| 原平市| 卓资县| 建宁县| 柘荣县| 平远县| 湘乡市| 祁东县| 乡宁县| 漠河县| 丹阳市| 祁门县| 明溪县| 宁安市| 基隆市| 南溪县| 溆浦县| 永州市| 京山县| 丰县| 和林格尔县| 新郑市| 柏乡县|