欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

單例模式的定義:

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

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

下面我們一一的進行介紹:

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

package singleton;

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

  public HungrySingletonP(){}

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

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

這種方法在類加載的時候就已經(jīng)實例化了(只創(chuàng)建唯一的實例),所以不存在線程上的一些問題。但是,也因為如此如果有太多的單例,且這些實例不經(jīng)常使用那么久會造成對內(nèi)存的浪費。

2.懶漢模式,同樣什么叫做懶漢模式?一個懶惰的人,只有去吃飯的時候才會去刷碗(昨天用過的臟碗),即:只有當用到對象的時候才去創(chuàng)建對象,來上代碼:

package singleton;

public class LasySingletonV1 {
  private static LasySingletonV1 instance;

  public LasySingletonV1(){}

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

上面的這段代碼是懶漢模式,當我們不需要實例的時候,它不會創(chuàng)建實例,只有需要實例的時候,才會創(chuàng)建,節(jié)省空間。
但是,我們不推薦使用,因為我們原來的設(shè)計理念是:當需要的時候(并且instance為空)創(chuàng)建實例,當已經(jīng)創(chuàng)建過后,如果還需要實例,則判斷instance是否為空,因為前邊已經(jīng)創(chuàng)建過了,不為空,所以直接返回之前已經(jīng)創(chuàng)建的實例。
以上的想法是很好的,但是它是線程不安全的。因為:當有多個線程同時調(diào)用這個方法時,因為同時判斷實例為空,所以會創(chuàng)建很多個實例,這不符合單例模式的設(shè)計理念(一個類只有一個實例對象)。

所以我們需要對它進行改進,因為它會異步創(chuàng)建多個實例,多以我們很容易就能想到,在getInstance方法之前加上synchronized進行同步:

package singleton;

public class LasySingletonV2 {
  private static LasySingletonV2 instance;

  public LasySingletonV2(){}

  public synchronized LasySingletonV2 getInstance(){

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

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

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

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

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;
  }
}

以上的方法是懶漢模式的完整版本,我們來仔細分析一下:

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

沒有獲得鎖的線程一直等待到獲得鎖的線程釋放鎖,當在等待的線程獲得鎖的時候進入下一步,還要進行判斷instance是否為空,但是這個時候instance已經(jīng)不為空了,因為前面的線程已經(jīng)創(chuàng)建了實例,所以返回已經(jīng)創(chuàng)建好的實例。

以上是第一批調(diào)用getInstance方法的線程,當后續(xù)的線程調(diào)用這個方法的時候就不用進行鎖的獲取了和釋放了,因為第一步已經(jīng)判斷instance不為空,直接返回instance實例。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 舉例講解Java設(shè)計模式編程中Decorator裝飾者模式的運用

    舉例講解Java設(shè)計模式編程中Decorator裝飾者模式的運用

    這篇文章主要介紹了Java設(shè)計模式編程中Decorator裝飾者模式的運用,裝飾者模式就是給一個對象動態(tài)的添加新的功能,裝飾者和被裝飾者實現(xiàn)同一個接口,裝飾者持有被裝飾者的實例,需要的朋友可以參考下
    2016-05-05
  • Java 高精度的大數(shù)字運算方式

    Java 高精度的大數(shù)字運算方式

    這篇文章主要介紹了Java 高精度的大數(shù)字運算方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot參數(shù)驗證10個技巧值得收藏

    SpringBoot參數(shù)驗證10個技巧值得收藏

    Spring Boot提供了內(nèi)置的驗證注解,可以幫助簡單、快速地對輸入字段進行驗證,例如檢查 null 或空字段、強制執(zhí)行長度限制、使用正則表達式驗證模式以及驗證電子郵件地址,那么在Spring Boot應(yīng)用中如何做好參數(shù)校驗工作呢,本文提供了10個小技巧感興趣的朋友一起看看吧
    2023-08-08
  • 快速學習JavaWeb中監(jiān)聽器(Listener)的使用方法

    快速學習JavaWeb中監(jiān)聽器(Listener)的使用方法

    這篇文章主要幫助大家快速學習JavaWeb中監(jiān)聽器(Listener)的使用方法,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 使用Spring?AOP實現(xiàn)用戶操作日志功能

    使用Spring?AOP實現(xiàn)用戶操作日志功能

    這篇文章主要介紹了使用Spring?AOP實現(xiàn)了用戶操作日志功能,功能實現(xiàn)需要一張記錄日志的log表,結(jié)合示例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 深入解析Java的設(shè)計模式編程中建造者模式的運用

    深入解析Java的設(shè)計模式編程中建造者模式的運用

    這篇文章主要介紹了深入解析Java的設(shè)計模式編程中建造者模式的運用,同時文中也介紹了建造者模式與工廠模式的區(qū)別,需要的朋友可以參考下
    2016-02-02
  • java實現(xiàn)音頻轉(zhuǎn)文本的實現(xiàn)步驟

    java實現(xiàn)音頻轉(zhuǎn)文本的實現(xiàn)步驟

    本文主要介紹了java實現(xiàn)音頻轉(zhuǎn)文本的實現(xiàn)步驟,可以通過使用一些現(xiàn)成的庫或者API來實現(xiàn),文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • Mybatis中ResultMap解決屬性名和數(shù)據(jù)庫字段名不一致問題

    Mybatis中ResultMap解決屬性名和數(shù)據(jù)庫字段名不一致問題

    我們Pojo類的屬性名和數(shù)據(jù)庫中的字段名不一致的現(xiàn)象時有發(fā)生,本文就詳細的介紹一下Mybatis中ResultMap解決屬性名和數(shù)據(jù)庫字段名不一致問題,感興趣的可以了解一下
    2021-10-10
  • Java解決線程安全的兩種方式分享

    Java解決線程安全的兩種方式分享

    這篇文章主要為大家詳細介紹了Java中兩種常用的解決線程安全的方式——Synchornized和Lock,文中的示例代碼簡潔易懂,快跟隨小編一起學習起來吧
    2023-06-06
  • 帶你快速搞定java多線程(3)

    帶你快速搞定java多線程(3)

    這篇文章主要介紹了java多線程編程實例,分享了幾則多線程的實例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07

最新評論