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

Java中的四種單例模式淺析

 更新時間:2017年05月11日 11:54:37   作者:柒  
這篇文章主要給大家介紹了關(guān)于Java中四種單例模式的相關(guān)資料,其中包括餓漢式、懶漢式、懶漢式(雙重鎖)及內(nèi)部類等四種,分別給出了詳細(xì)的示例代碼和介紹,需要的朋友們下面來一起看看吧。

前言

近期在做支付,一開始圖省事,也是為了調(diào)試方便,支付的alipayClient和tradeService都是使用的時候去拿,這樣就會導(dǎo)致創(chuàng)建多次。為了節(jié)省資源,統(tǒng)一配置成單例模式。

什么是單例

Singleton(單例)是設(shè)計模式的一種,為了保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。

單例特點

  • 單例類確保自己只有一個實例(構(gòu)造函數(shù)私有:不被外部實例化,也不被繼承)。
  • 單例類必須自己創(chuàng)建自己的實例。
  • 單例類必須為其他對象提供唯一的實例。

單例應(yīng)用

資源管理器,回收站,打印機(jī)資源,線程池,緩存,配置信息類,管理類,控制類,門面類,代理類通常被設(shè)計為單例類。如果程序有多個類加載器又同時使用單例模式就要保證單例的唯一性了。

實現(xiàn)方式

餓漢式

/**
 * 餓漢式
 *
 */
public class Singleton {
 private static Singleton instance = new Singleton();
 //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 
 private Singleton() {} 
 //提供全局訪問點獲取唯一的實例 
 public static Singleton getInstance() { 
   return instance; 
 } 
}

如果開銷比較大,希望用到時才創(chuàng)建就要考慮延遲實例化,就要用后面的方法了。

懶漢式

/**
 * 懶漢式
 */
public class Singleton {
 private static Singleton instance;
 //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 
 private Singleton() {} 
 public static synchronized Singleton getInstance() { 
  if(instance==null){
   instance = new Singleton();
  }
  return instance; 
 } 
}

懶漢式(雙重鎖)

“雙檢鎖”(Double-Checked Lock)盡量將”加鎖”推遲,只在需要時”加鎖”(僅適用于java 5.0 以上版本,volatile保證原子操作)。

happens-before:”什么什么一定在什么什么之前運行”,也就是保證順序性。

現(xiàn)在的CPU有亂序執(zhí)行的能力(也就是指令會亂序或并行運行,可以不按我們寫代碼的順序執(zhí)行內(nèi)存的存取過程),并且多個CPU之間的緩存也不保證實時同步,只有上面的happens-before所規(guī)定的情況下才保證順序性。

JVM能夠根據(jù)CPU的特性(CPU的多級緩存系統(tǒng)、多核處理器等)適當(dāng)?shù)闹匦屡判驒C(jī)器指令,使機(jī)器指令更符合CPU的執(zhí)行特點,最大限度的發(fā)揮機(jī)器的性能.

如果沒有volatile修飾符則可能出現(xiàn)一個線程t1的B操作和另一線程t2的C操作之間對instance的讀寫沒有happens-before,可能會造成的現(xiàn)象是t1的B操作還沒有完全構(gòu)造成功,但t2的C已經(jīng)看到instance為非空,這樣t2就直接返回了未完全構(gòu)造的instance的引用,t2想對instance進(jìn)行操作就會出問題。

volatile 的功能:

  • 避免編譯器將變量緩存在寄存器里
  • 避免編譯器調(diào)整代碼執(zhí)行的順序

優(yōu)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份

/**
 * 懶漢式(雙重鎖)
 */
public class Singleton {
 //使用 volatile 保證可見性
 private volatile static Singleton instance;
 //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 
 private Singleton() {} 
 public static Singleton getInstance() { 
  if(instance==null){
   synchronized(Singleton.class){
    if(instance==null){
     instance = new Singleton();
    }
   }
  }
  return instance; 
 } 
}

內(nèi)部類

/**
 * 內(nèi)部類
 */
public class Singleton {
 //私有的默認(rèn)構(gòu)造子,保證外界無法直接實例化 
 private Singleton() {} 
 /**
  * 類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實例與外部類的實例
  * 沒有綁定關(guān)系,而且只有被調(diào)用到才會裝載,從而實現(xiàn)了延遲加載
  */
 private static class SingletonHolder{
  /**
   * 靜態(tài)初始化器,由JVM來保證線程安全
   */
  private static Singleton instance = new Singleton();
 }
 public static Singleton getInstance() { 
  return SingletonHolder.instance; 
 } 
}

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java基礎(chǔ)知識之StringReader流的使用

    Java基礎(chǔ)知識之StringReader流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識之StringReader流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java ClassCastException異常解決方案

    Java ClassCastException異常解決方案

    這篇文章主要介紹了Java ClassCastException異常解決方案,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Maven 不同環(huán)境靈活構(gòu)建的步驟

    Maven 不同環(huán)境靈活構(gòu)建的步驟

    在項目開發(fā)過程中,合理地使用Maven管理不同的構(gòu)建環(huán)境(開發(fā)、測試、生產(chǎn))是提高項目管理效率和應(yīng)對復(fù)雜項目需求的關(guān)鍵,本文就來介紹一下Maven 不同環(huán)境靈活構(gòu)建的步驟,感興趣的可以了解一下
    2024-10-10
  • 詳細(xì)講解Java輸入語句的寫法

    詳細(xì)講解Java輸入語句的寫法

    作為初步進(jìn)入java開發(fā)學(xué)習(xí)的小白來說,學(xué)習(xí)java語言一開始的時候得一步步的學(xué)習(xí),比如說java輸入語句應(yīng)該這么去實現(xiàn)呢,這篇文章主要給大家介紹了關(guān)于Java輸入語句的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • java base64編碼、解碼的三種方式總結(jié)

    java base64編碼、解碼的三種方式總結(jié)

    這篇文章主要介紹了java base64編碼、解碼的三種方式,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • windows定時器配置執(zhí)行java jar文件的方法詳解

    windows定時器配置執(zhí)行java jar文件的方法詳解

    這篇文章主要給大家介紹了關(guān)于windows定時器配置執(zhí)行java jar文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • java利用StringTokenizer分割字符串的實現(xiàn)

    java利用StringTokenizer分割字符串的實現(xiàn)

    利用java.util.StringTokenizer的方法,可以將一個字符串拆分為一系列的標(biāo)記,本文就來介紹一下java利用StringTokenizer分割字符串的實現(xiàn),感興趣的可以了解一下
    2023-10-10
  • 微信小程序之搜索分頁功能的實現(xiàn)代碼

    微信小程序之搜索分頁功能的實現(xiàn)代碼

    這篇文章主要介紹了微信小程序之搜索分頁功能的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Spring Boot啟動端口修改方法

    Spring Boot啟動端口修改方法

    spring boot是個好東西,可以不用容器直接在main方法中啟動,而且無需配置文件,方便快速搭建環(huán)境。下面通過本文給大家分享Spring Boot修改啟動端口的方法,感興趣的的朋友一起看看吧
    2017-07-07
  • 淺談java 中文件的讀取File、以及相對路徑的問題

    淺談java 中文件的讀取File、以及相對路徑的問題

    今天小編就為大家分享一篇淺談java 中文件的讀取File、以及相對路徑的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07

最新評論

荣昌县| 灌云县| 苍溪县| 馆陶县| 政和县| 南涧| 新沂市| 天峻县| 泊头市| 桐乡市| 上高县| 资溪县| 淮北市| 赣榆县| 德化县| 确山县| 习水县| 济南市| 南华县| 曲阜市| 鲁甸县| 安西县| 通道| 三台县| 阿拉尔市| 平阴县| 禄劝| 左权县| 长兴县| 平顶山市| 溧阳市| 县级市| 盐边县| 铁岭市| 伽师县| 萝北县| 房产| 申扎县| 津南区| 新化县| 华蓥市|