国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|

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

Java中的四種單例模式淺析

2020-09-29 13:47 JAVA教程

這篇文章主要給大家介紹了關(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)方式

餓漢式

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

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

懶漢式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
 * 懶漢式
 */
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)化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份

?
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;
 //私有的默認(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)部類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 內(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í)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲三级在线 | 国产美女自拍视频 | 国产精品久久久久久久久久久久久久 | 免费大片黄在线观看 | 剑来在线观看 | 精品视频一区二区三区在线观看 | 国产精品免费在线 | 国产一区二区三区免费看 | 一区亚洲| 国产免费久久精品 | www.久久.com| 国产精品视频一区二区三区不卡 | 精品久久网| 韩日av在线 | 亚洲激情在线 | 日一区二区三区 | 91精品久久久久久久久中文字幕 | 99热国| 中文字幕国产一区 | 日韩精品专区在线影院重磅 | 欧美成人免费在线观看 | 九一精品 | 三级无遮挡污在线观看 | 国产乱xxxxx97国语对白 | 亚洲视频免费在线观看 | 亚洲国产高清在线播放 | 欧美视频成人 | 精品入口麻豆88视频 | 日韩精品一区二区三区第95 | 欧美日韩视频 | 一级做a爰片性色毛片精油 欧美中文字幕在线观看 | 亚洲综合自拍 | 欧美精品在线一区 | 在线视频 亚洲 | 精品av| 国产一区不卡 | 中文二区 | 欧美在线观看成人 | 在线观看91视频 | 草久在线视频 | 日韩视频精品在线 |