一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術|正則表達式|

服務器之家 - 編程語言 - JAVA教程 - Java中的四種單例模式淺析

Java中的四種單例模式淺析

2020-09-29 13:47 JAVA教程

這篇文章主要給大家介紹了關于Java中四種單例模式的相關資料,其中包括餓漢式、懶漢式、懶漢式(雙重鎖)及內部類等四種,分別給出了詳細的示例代碼和介紹,需要的朋友們下面來一起看看吧。

前言

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

什么是單例

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

單例特點

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

單例應用

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

實現方式

餓漢式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * 餓漢式
 *
 */
public class Singleton {
 private static Singleton instance = new Singleton();
 //私有的默認構造子,保證外界無法直接實例化
 private Singleton() {}
 //提供全局訪問點獲取唯一的實例
 public static Singleton getInstance() {
   return instance;
 }
}

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

懶漢式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 懶漢式
 */
public class Singleton {
 private static Singleton instance;
 //私有的默認構造子,保證外界無法直接實例化
 private Singleton() {}
 public static synchronized Singleton getInstance() {
  if(instance==null){
   instance = new Singleton();
  }
  return instance;
 }
}

懶漢式(雙重鎖)

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

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

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

JVM能夠根據CPU的特性(CPU的多級緩存系統、多核處理器等)適當的重新排序機器指令,使機器指令更符合CPU的執行特點,最大限度的發揮機器的性能.

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

volatile 的功能:

  • 避免編譯器將變量緩存在寄存器里
  • 避免編譯器調整代碼執行的順序

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * 懶漢式(雙重鎖)
 */
public class Singleton {
 //使用 volatile 保證可見性
 private volatile static Singleton instance;
 //私有的默認構造子,保證外界無法直接實例化
 private Singleton() {}
 public static Singleton getInstance() {
  if(instance==null){
   synchronized(Singleton.class){
    if(instance==null){
     instance = new Singleton();
    }
   }
  }
  return instance;
 }
}

內部類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 內部類
 */
public class Singleton {
 //私有的默認構造子,保證外界無法直接實例化
 private Singleton() {}
 /**
  * 類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例
  * 沒有綁定關系,而且只有被調用到才會裝載,從而實現了延遲加載
  */
 private static class SingletonHolder{
  /**
   * 靜態初始化器,由JVM來保證線程安全
   */
  private static Singleton instance = new Singleton();
 }
 public static Singleton getInstance() {
  return SingletonHolder.instance;
 }
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://blog.52itstyle.com/archives/872/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 爱欲荡漾在线观看 | 大又大又粗又爽女人毛片 | 99热在线获取最新地址 | 国产午夜永久福利视频在线观看 | 国产视频一区 | 亚洲精品成人A8198A片漫画 | 久久内在线视频精品mp4 | 成人免费在线视频观看 | 日韩网站在线观看 | 日韩欧美中文字幕一区二区三区 | 拿捏小说 | 成人免费毛片一区二区三区 | 2022国产麻豆剧传媒剧情 | 成人国产在线视频 | 日本大片免a费观看在线 | 精品久久久久久久久久久 | 99视频在线免费观看 | 欧美午夜视频一区二区 | les女同h高h喷水 | 亚洲欧美一区二区三区不卡 | 俄罗斯精品bbw | 天美麻豆 | 国产成人a∨麻豆精品 | 爱色综合v | 日韩国产欧美一区二区三区 | avtt天堂网手机版亚洲 | 日韩在线一区二区三区免费视频 | 国产亚洲精品激情一区二区三区 | 洗濯屋动漫在线观看 | 波多 在线播放 | 成年人在线观看视频 | 四虎影视永久在线精品免费 | 日产中文乱码卡一卡二 | 亚洲福利天堂网福利在线观看 | 娇女的呻吟亲女禁忌h16 | 韩国最新理论三级在线观看 | 日本www色视频成人免费 | 欧美一卡二卡科技有限公司 | 国产亚洲成归v人片在线观看 | 奇米888在线看奇米999 | 无人在线观看免费高清视频播放 |