亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解java 單例模式及方法總結(jié)

 更新時(shí)間:2017年05月22日 09:42:19   作者:super_YC  
這篇文章主要介紹了詳解java 單例模式及方法總結(jié)的相關(guān)資料,需要的朋友可以參考下

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

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

Singleton是一種創(chuàng)建型模式,指某個(gè)類采用Singleton模式,則在這個(gè)類被創(chuàng)建后,只可能產(chǎn)生一個(gè)實(shí)例供外部訪問,并且提供一個(gè)全局的訪問點(diǎn)。

核心知識(shí)點(diǎn)如下:

(1) 將采用單例設(shè)計(jì)模式的類的構(gòu)造方法私有化(采用private修飾)。

(2) 在其內(nèi)部產(chǎn)生該類的實(shí)例化對(duì)象,并將其封裝成private static類型。

(3) 定義一個(gè)靜態(tài)方法返回該類的實(shí)例。

/** 
 * 方法一
 * 單例模式的實(shí)現(xiàn):餓漢式,線程安全 但效率比較低 
 */ 
public class SingletonTest { 

  // 定義一個(gè)私有的構(gòu)造方法
  private SingletonTest() { 
  } 

  // 將自身的實(shí)例對(duì)象設(shè)置為一個(gè)屬性,并加上Static和final修飾符
  private static final SingletonTest instance = new SingletonTest(); 

  // 靜態(tài)方法返回該類的實(shí)例
  public static SingletonTest getInstancei() { 
    return instance; 
  } 
 
}

方法一就是傳說的中的餓漢模式

優(yōu)點(diǎn)是:寫起來(lái)比較簡(jiǎn)單,而且不存在多線程同步問題,避免了synchronized所造成的性能問題;

缺點(diǎn)是:當(dāng)類SingletonTest被加載的時(shí)候,會(huì)初始化static的instance,靜態(tài)變量被創(chuàng)建并分配內(nèi)存空間,從這以后,這個(gè)static的instance對(duì)象便一直占著這段內(nèi)存(即便你還沒有用到這個(gè)實(shí)例),當(dāng)類被卸載時(shí),靜態(tài)變量被摧毀,并釋放所占有的內(nèi)存,因此在某些特定條件下會(huì)耗費(fèi)內(nèi)存。

/** 
 *方法二
 * 單例模式的實(shí)現(xiàn):飽漢式,非線程安全  
 *  
 */ 
public class SingletonTest {

  // 定義私有構(gòu)造方法(防止通過 new SingletonTest()去實(shí)例化)
  private SingletonTest() {  
  }  

  // 定義一個(gè)SingletonTest類型的變量(不初始化,注意這里沒有使用final關(guān)鍵字)
  private static SingletonTest instance;  

  // 定義一個(gè)靜態(tài)的方法(調(diào)用時(shí)再初始化SingletonTest,但是多線程訪問時(shí),可能造成重復(fù)初始化問題)
  public static SingletonTest getInstance() {  
    if (instance == null)  
      instance = new SingletonTest();  
    return instance;  
  }  
} 

方法二就是傳說的中的飽漢模式

優(yōu)點(diǎn)是:寫起來(lái)比較簡(jiǎn)單,當(dāng)類SingletonTest被加載的時(shí)候,靜態(tài)變量static的instance未被創(chuàng)建并分配內(nèi)存空間,當(dāng)getInstance方法第一次被調(diào)用時(shí),初始化instance變量,并分配內(nèi)存,因此在某些特定條件下會(huì)節(jié)約了內(nèi)存;

缺點(diǎn)是:并發(fā)環(huán)境下很可能出現(xiàn)多個(gè)SingletonTest實(shí)例。

/** 
 *方法三
 * 單例模式的實(shí)現(xiàn):飽漢式,線程安全簡(jiǎn)單實(shí)現(xiàn)  
 *  
 */ 
public class SingletonTest {

  // 定義私有構(gòu)造方法(防止通過 new SingletonTest()去實(shí)例化)
  private SingletonTest() {  
  }  

  // 定義一個(gè)SingletonTest類型的變量(不初始化,注意這里沒有使用final關(guān)鍵字)
  private static SingletonTest instance;  

  // 定義一個(gè)靜態(tài)的方法(調(diào)用時(shí)再初始化SingletonTest,使用synchronized 避免多線程訪問時(shí),可能造成重的復(fù)初始化問題)
  public static synchronized SingletonTest getInstance() {  
    if (instance == null)  
      instance = new SingletonTest();  
    return instance;  
  }  
} 

方法三為方法二的簡(jiǎn)單優(yōu)化

優(yōu)點(diǎn)是:使用synchronized關(guān)鍵字避免多線程訪問時(shí),出現(xiàn)多個(gè)SingletonTest實(shí)例。

缺點(diǎn)是:同步方法頻繁調(diào)用時(shí),效率略低。

/** 
 * 方法四
 * 單例模式最優(yōu)方案
 * 線程安全 并且效率高 
 * 
 */ 
public class SingletonTest { 

  // 定義一個(gè)私有構(gòu)造方法
  private SingletonTest() { 
   
  }  
  //定義一個(gè)靜態(tài)私有變量(不初始化,不使用final關(guān)鍵字,使用volatile保證了多線程訪問時(shí)instance變量的可見性,避免了instance初始化時(shí)其他變量屬性還沒賦值完時(shí),被另外線程調(diào)用)
  private static volatile SingletonTest instance; 

  //定義一個(gè)公有的靜態(tài)方法,返回該類型實(shí)例
  public static SingletonTest getIstance() { 
    // 對(duì)象實(shí)例化時(shí)與否判斷(不使用同步代碼塊,instance不等于null時(shí),直接返回對(duì)象,提高運(yùn)行效率)
    if (instance == null) {
      //同步代碼塊(對(duì)象未初始化時(shí),使用同步代碼塊,保證多線程訪問時(shí)對(duì)象在第一次創(chuàng)建后,不再重復(fù)被創(chuàng)建)
      synchronized (SingletonTest.class) {
        //未初始化,則初始instance變量
        if (instance == null) {
          instance = new SingletonTest();  
        }  
      }  
    }  
    return instance;  
  }  
}

方法四為單例模式的最佳實(shí)現(xiàn)。內(nèi)存占用地,效率高,線程安全,多線程操作原子性。 

(事實(shí)上,可以通過Java反射機(jī)制來(lái)實(shí)例化private類型的構(gòu)造方法,此時(shí)基本上會(huì)使所有的Java單例實(shí)現(xiàn)失效。本帖不討論反射情況下問題,默認(rèn)無(wú)反射,也是常見的面試已經(jīng)應(yīng)用場(chǎng)景)

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

相關(guān)文章

  • maven?scope?provided和runtime的例子說明

    maven?scope?provided和runtime的例子說明

    這篇文章主要介紹了maven?scope?provided和runtime的例子說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java利用DFA算法實(shí)現(xiàn)敏感詞過濾功能

    java利用DFA算法實(shí)現(xiàn)敏感詞過濾功能

    在最近的開發(fā)中遇到了敏感詞過濾,便去網(wǎng)上查閱了很多敏感詞過濾的資料,在這里也和大家分享一下自己的理解。下面這篇文章主要給大家介紹了關(guān)于java利用DFA算法實(shí)現(xiàn)敏感詞過濾功能的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-06-06
  • MyBatis使用注解開發(fā)和無(wú)主配置文件開發(fā)的情況

    MyBatis使用注解開發(fā)和無(wú)主配置文件開發(fā)的情況

    這篇文章主要介紹了MyBatis使用注解開發(fā)和無(wú)主配置文件開發(fā)的情況,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • 詳解java中的互斥鎖信號(hào)量和多線程等待機(jī)制

    詳解java中的互斥鎖信號(hào)量和多線程等待機(jī)制

    這篇文章主要介紹了Java編程中的互斥鎖,信號(hào)量和多線程等待機(jī)制實(shí)例詳解,簡(jiǎn)單介紹了互斥鎖和信號(hào)量的區(qū)別,需要的朋友可以了解下。
    2017-09-09
  • MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析詳解

    MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析詳解

    這篇文章主要介紹了MyBatis Plus插件機(jī)制與執(zhí)行流程原理分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • springboot配置文件綁定實(shí)現(xiàn)解析

    springboot配置文件綁定實(shí)現(xiàn)解析

    這篇文章主要介紹了springboot配置文件綁定實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • java實(shí)現(xiàn)頁(yè)面置換算法

    java實(shí)現(xiàn)頁(yè)面置換算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)頁(yè)面置換算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • SpringBoot2基于重復(fù)創(chuàng)建bean的問題及解決

    SpringBoot2基于重復(fù)創(chuàng)建bean的問題及解決

    這篇文章主要介紹了SpringBoot2基于重復(fù)創(chuàng)建bean的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java Http請(qǐng)求傳json數(shù)據(jù)亂碼問題的解決

    Java Http請(qǐng)求傳json數(shù)據(jù)亂碼問題的解決

    這篇文章主要介紹了Java Http請(qǐng)求傳json數(shù)據(jù)亂碼問題的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解決mybatis三表連接查詢數(shù)據(jù)重復(fù)的問題

    解決mybatis三表連接查詢數(shù)據(jù)重復(fù)的問題

    這篇文章主要介紹了解決mybatis三表連接查詢數(shù)據(jù)重復(fù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2021-01-01

最新評(píng)論