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

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

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

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

 單例設(shè)計模式

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

核心知識點如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • java利用java.net.URLConnection發(fā)送HTTP請求的方法詳解

    java利用java.net.URLConnection發(fā)送HTTP請求的方法詳解

    如何通過Java(模擬瀏覽器)發(fā)送HTTP請求是我們在日常經(jīng)常會遇到的問題,下面這篇文章主要給大家介紹了關(guān)于java利用java.net.URLConnection發(fā)送HTTP請求的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • MyBatis入門程序

    MyBatis入門程序

    MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。接下來本文給大家?guī)砹薓yBatis入門程序,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • spring中使用@Autowired注解無法注入的情況及解決

    spring中使用@Autowired注解無法注入的情況及解決

    這篇文章主要介紹了spring中使用@Autowired注解無法注入的情況及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式

    Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式

    這篇文章主要介紹了Mybatis查找返回Map,List集合類型的數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringMVC之RequestContextHolder詳細(xì)解析

    SpringMVC之RequestContextHolder詳細(xì)解析

    這篇文章主要介紹了SpringMVC之RequestContextHolder詳細(xì)解析,正常來說在service層是沒有request的,然而直接從controlller傳過來的話解決方法太粗暴,后來發(fā)現(xiàn)了SpringMVC提供的RequestContextHolder,需要的朋友可以參考下
    2023-11-11
  • 簡單了解Spring中的事務(wù)控制

    簡單了解Spring中的事務(wù)控制

    這篇文章主要介紹了簡單了解Spring中的事務(wù)控制,事務(wù)是一組操作的執(zhí)行單元,下面我們來簡單學(xué)習(xí)一下吧
    2019-05-05
  • Java?關(guān)鍵字break和continue的使用說明

    Java?關(guān)鍵字break和continue的使用說明

    這篇文章主要介紹了Java?關(guān)鍵字break和continue的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 詳解Java的線程的優(yōu)先級以及死鎖

    詳解Java的線程的優(yōu)先級以及死鎖

    這篇文章主要介紹了詳解Java的線程的優(yōu)先級以及死鎖,線程是Java編程學(xué)習(xí)中的重要知識,需要的朋友可以參考下
    2015-09-09
  • 基于Java注解(Annotation)的自定義注解入門介紹

    基于Java注解(Annotation)的自定義注解入門介紹

    要深入學(xué)習(xí)注解,我們就必須能定義自己的注解,并使用注解,在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關(guān)定義注解的語法
    2013-04-04
  • Java編程實現(xiàn)比對兩個文本文件并標(biāo)記相同與不同之處的方法

    Java編程實現(xiàn)比對兩個文本文件并標(biāo)記相同與不同之處的方法

    這篇文章主要介紹了Java編程實現(xiàn)比對兩個文本文件并標(biāo)記相同與不同之處的方法,涉及java針對文本文件的讀取、遍歷、判斷等相關(guān)操作技巧,需要的朋友可以參考下
    2017-10-10

最新評論

淳安县| 鹤庆县| 松阳县| 原阳县| 石门县| 来凤县| 大悟县| 那曲县| 炎陵县| 邢台县| 金坛市| 宿州市| 大冶市| 肃北| 左权县| 肥西县| 华宁县| 陕西省| 大荔县| 华亭县| 成安县| 阿坝| 拜泉县| 睢宁县| 唐山市| 定边县| 偃师市| 连平县| 黔西| 伊川县| 达尔| 扬中市| 西藏| 通许县| 淄博市| 宜川县| 鹤岗市| 通海县| 札达县| 教育| 九江市|