国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

小小的單例模式竟然有這么多種寫法?

開發 前端
單例模式應該是設計模式中最容易理解也是用得最多的一種模式了,同時也是面試的時候最常被問到的模式。

[[404953]]

單例模式應該是設計模式中最容易理解也是用得最多的一種模式了,同時也是面試的時候最常被問到的模式。

1. 單例模式的定義

單例模式指的是一個類中在任何情況下都絕對只有一個實例,并且提供一個全局訪問點。

2. 單例模式的應用場景

單例模式的應用非常廣泛,如數據庫中的連接池、J2EE中的ServletContext和ServletContextConfig、Spring框架中的ApplicationContext等等。然而在Java中,單例模式還可以保證一個JVM中只存在一個唯一的實例。

單例模式的應用場景主要有以下幾個方面:

  • 當需要頻繁創建一些類的時候,使用單例可以降低系統的內存壓力,減少GC(垃圾回收) ;
  • 當某些類創建實例時候需要占用的資源較多,或者實例化過程耗時比較長,且經常使用的情況;
  • 當存在頻繁訪問數據庫或者文件的對象;
  • 當對于一些控制硬件級別的操作,或者從系統上來講應當是單一控制邏輯的操作,是不允許存在多個實例的,否則玩完;

3. 單例模式的優缺點

3.1 單例模式的優點

  • 單例模式可以保證內存中只有一個實例對象,從而會減少內存的開銷;
  • 單例模式可以避免對資源的多重占用;
  • 單例模式設置全局訪問點,可以起到優化和共享資源的訪問的作用;

3.2 單例模式的缺點

  • 擴展難, 因為單例模式通常是沒有接口的啊,如果想要擴展,那么你唯一途徑就是修改之前的代碼,所以說單例模式違背了開閉原則;
  • 調試難,因為在并發測試中,單例模式是不利于代碼的調試的,單例中的代碼沒有執行完,也不能模擬生成一個新對象;
  • 違背單一職責原則,因為單例模式的業務代碼通常寫在一個類中,如果功能設計不合理,就很容易違背單一職責原則;

4. 單例模式的實現方式及其優缺點

4.1 單例模式的餓漢式實現

4.1.1 餓漢式標準寫法

Singleton類稱為單例類,通過內部初始化一次 , 隱藏構造方法, 并提供一個全局訪問點的方式實現。

  1. /** 
  2.  * msJava 
  3.  * 
  4.  * @Description 單例模式的通用寫法 
  5.  * @Date 2021-01-23 
  6.  */ 
  7. public class Singleton { 
  8.     /** 
  9.      * 內部初始化一次 
  10.      */ 
  11.     private static final Singleton instance = new Singleton(); 
  12.  
  13.     /** 
  14.      * 隱藏構造方法 
  15.      */ 
  16.     private Singleton() { 
  17.     } 
  18.  
  19.     /** 
  20.      * 提供一個全局訪問點 
  21.      * 
  22.      * @return Singleton 
  23.      */ 
  24.     public static Singleton getInstance() { 
  25.         return instance; 
  26.     } 
  27.  

以上餓漢式單例寫法在類的初始化的時候就會進行初始化操作,并且創建對象,絕對的線程安全,因為此時線程還沒有出現就已經實例化了,故不會存在訪問安全的問題。

4.1.2 餓漢式靜態塊機制寫法

餓漢式還有一種實現,那就是靜態塊機制,如下代碼所示:

  1. /** 
  2.  * msJava 
  3.  * 
  4.  * @Description 單例模式  餓漢式靜態機制 實現 
  5.  * @Date 2021-01-23 
  6.  */ 
  7. public class HungryStaticSingleton { 
  8.      
  9.     private static final HungryStaticSingleton hungrySingleton; 
  10.     //靜態代碼塊 類加載的時候就初始化 
  11.     static { 
  12.         hungrySingleton=new HungryStaticSingleton(); 
  13.     } 
  14.     /** 
  15.      * 私有化構造函數 
  16.      */ 
  17.     private HungryStaticSingleton(){} 
  18.  
  19.     /** 
  20.      * 提供一個全局訪問點 
  21.      * @return 
  22.      */ 
  23.     public static HungryStaticSingleton getInstance() { 
  24.         return hungrySingleton; 
  25.     } 

我們分析一下這種是寫法 ,可以明顯的看到所以對象是類在加載的時候就進行實例化了,那么這樣一來,會導致單例對象的數量不確定,從而會導致系統初始化的時候就造成大量內存浪費,況且你用不用還不一定,還一直占著空間,俗稱“占著茅坑不拉屎”。

4.2 單例模式的懶漢式實現

為了解決餓漢式單例寫法可能帶來的內存浪費問題,這里分析一下懶漢式單例的寫法。如下代碼所示:

  1. /** 
  2.  * msJava 
  3.  * 
  4.  * @Description 單例模式  懶漢式單例實現 
  5.  * @Date 2021-01-23 
  6.  */ 
  7. public class LazySimpleSingleton { 
  8.  
  9.     private static LazySimpleSingleton lazySingleton = null
  10.  
  11.     /** 
  12.      * 私有化構造函數 
  13.      */ 
  14.     private LazySimpleSingleton() { 
  15.  
  16.     } 
  17.     /** 
  18.      * 提供一個全局訪問點 
  19.      * 
  20.      * @return 
  21.      */ 
  22.     public static LazySimpleSingleton getInstance() { 
  23.         if (lazySingleton == null) { 
  24.             lazySingleton = new LazySimpleSingleton(); 
  25.         } 
  26.         return lazySingleton; 
  27.     } 

這樣實現的好處就是只有對象被使用的時候才會進行初始化,不會存在內存浪費的問題,但是它會在多線程環境下,存在線程安全問題。我們可以利用synchronized關鍵字將全局訪問點方法變成一個同步方法,這樣就可以解決線程安全的問題,代碼如下所示:

  1. /** 
  2.  * msJava 
  3.  * 
  4.  * @Description 單例模式  懶漢式單例實現 synchronized修飾  
  5.  * @Date 2021-01-23 
  6.  */ 
  7. public class LazySimpleSingleton { 
  8.     private static LazySimpleSingleton lazySingleton = null
  9.     /** 
  10.      * 私有化構造函數 
  11.      */ 
  12.     private LazySimpleSingleton() {} 
  13.     /** 
  14.      * 提供一個全局訪問點   
  15.      * 
  16.      * @return 
  17.      */ 
  18.     public synchronized static  LazySimpleSingleton getInstance() { 
  19.         if (lazySingleton == null) { 
  20.             lazySingleton = new LazySimpleSingleton(); 
  21.         } 
  22.         return lazySingleton; 
  23.     } 

但是,這樣雖然解決了線程安全的問題,可是如果在線程數量劇增的情況下,用synchronized加鎖,則會導致大批線程阻塞,從而驟減系統性能。

4.3 單例模式的雙重檢測實現

在上述代碼上進一步優化,代碼如下所示:

  1. /** 
  2.  * msJava 
  3.  * 
  4.  * @Description 單例模式  懶漢式-雙重檢測單例實現 
  5.  * @Date 2021-01-23 
  6.  */ 
  7. public class LazyDoubleCheckSingleton { 
  8.     // volatile 關鍵字修飾 
  9.     private volatile static LazyDoubleCheckSingleton lazySingleton ; 
  10.     /** 
  11.      * 私有化構造函數 
  12.      */ 
  13.     private LazyDoubleCheckSingleton() {} 
  14.     /** 
  15.      * 提供一個全局訪問點 
  16.      * 
  17.      * @return 
  18.      */ 
  19.     public static LazyDoubleCheckSingleton getInstance() { 
  20.         // 這里先判斷一下是否阻塞 
  21.         if (lazySingleton == null) { 
  22.             synchronized (LazyDoubleCheckSingleton.class){ 
  23.                 // 判斷是否需要重新創建實例 
  24.                 if (lazySingleton == null) { 
  25.                     lazySingleton = new LazyDoubleCheckSingleton(); 
  26.                 } 
  27.             } 
  28.         } 
  29.         return lazySingleton; 
  30.     } 

()方法時,第二個線程也可以調用,但是第一個線程執行synchronized時候,第二個線程就會發現阻塞,但是此時的阻塞是getInstance()內部的阻塞。

4.4 單例模式的靜態內部類實現

雖然雙重檢測鎖的單例模式解決了線程安全和性能問題,但是畢竟涉及加鎖的操作,多多少少就會到了性能的影響,下面我們分享一下更加優雅的單例模式實現,如下代碼所示:

  1. /** 
  2.  * msJava 
  3.  * 
  4.  * @Description 單例模式  靜態內部類單例實現 
  5.  * @Date 2021-01-23 
  6.  */ 
  7. public class LazyStaticInnerClassSingleton { 
  8.     //  在構造方法里面拋出異常真的合適? 
  9.   private LazyStaticInnerClassSingleton(){ 
  10.     if(LazyHolder.INSTANCE != null){ 
  11.         throw new RuntimeException("不允許創建多個實例"); 
  12.     } 
  13.   } 
  14.   // static 保證這個方法不會被重寫 覆蓋 
  15.   private static LazyStaticInnerClassSingleton getInstance(){ 
  16.       return LazyHolder.INSTANCE; 
  17.   } 
  18.   // Java 默認不會加載內部類 
  19.   private static class LazyHolder{ 
  20.       private static final LazyStaticInnerClassSingleton INSTANCE=new LazyStaticInnerClassSingleton(); 
  21.   } 

5. 總結

 

單例模式面試幾乎必備!

 

責任編輯:武曉燕 來源: 碼上Java
相關推薦

2021-02-03 20:19:08

Istio流量網格

2020-11-02 08:35:59

內存數據庫Redis

2016-09-01 13:54:23

Google太空電梯懸滑板

2013-01-24 09:44:44

數據庫

2024-05-13 16:22:25

固態硬盤接口硬盤

2020-06-01 08:04:18

三目運算符代碼

2022-03-03 07:00:43

Mybatiswhere標簽

2015-05-18 15:08:08

多種程序設計語言程序設計語言

2024-04-02 08:41:10

ArrayListSubList場景

2022-08-10 11:02:56

Python單例模式

2017-06-16 16:16:36

庫存扣減查詢

2018-06-26 15:00:24

Docker安全風險

2022-05-23 07:35:15

單例模式懶漢模式靜態內部類

2019-12-09 10:13:20

HashMap選擇容量

2017-03-07 17:45:42

Windows磁盤碎片整理

2023-07-26 00:32:33

注解抽象spring

2013-01-15 09:41:45

編程語言

2010-02-03 09:43:16

C++單例模式

2017-12-21 19:38:50

潤乾中間表

2022-07-26 23:43:29

編程語言開發Java
點贊
收藏

51CTO技術棧公眾號

欧美a级片一区| av在线一区二区三区| 久久五月天色综合| 丝袜美腿美女被狂躁在线观看| 99精品视频在线免费观看| 欧美日韩综合久久| 欧美成熟视频| 成人国产精品日本在线| 亚洲激情播播| 欧美一级淫片播放口| 国产69精品久久久久9999人| 亚洲国产天堂久久综合| 在线视频国产区| 欧美日韩黄色影视| 三级视频网站在线| 欧美日韩久久久久| 欧美美女色图| 91国偷自产一区二区三区成为亚洲经典 | 亚洲成人av| 国产精品国产三级国产专播精品人 | 女人让男人操自己视频在线观看| 欧美久久久久免费| 超碰免费在线| 欧美中文字幕不卡| 亚洲成a人v欧美综合天堂麻豆| 欧美系列一区二区| 国内精品久久久久国产| 精品国产精品一区二区夜夜嗨| 色呦呦在线看| 伊人亚洲福利一区二区三区| 久久伊人影院| 日本国产欧美一区二区三区| 精品视频免费| 国内精品二区| 国精产品一区一区三区mba桃花 | 亚洲欧美日本日韩| 在线观看免费91| 白白色 亚洲乱淫| 亚洲欧洲日本精品| 亚洲一区国产视频| av资源在线观看免费高清| 日韩情涩欧美日韩视频| 成人做爰视频www网站小优视频| 精品国产美女在线| 久久av资源| 久久国产精品99久久久久久丝袜 | 麻豆传媒视频在线观看免费| 日韩精品一区二区三区四区视频| 天堂8中文在线最新版在线| 久久精品国产欧美激情| 美女av一区| 成人免费看片网址| 激情综合网最新| 九九热精品在线播放| 一本一道波多野结衣一区二区| 国产探花视频在线观看| 欧美精品一区在线播放| 国产精品二区不卡| 国产系列第一页| 亚洲人午夜精品天堂一二香蕉| av网站在线免费观看| 亚洲人在线观看| 成人嘿咻视频免费看| 色噜噜狠狠色综合网| 国产精品嫩草影院com| 日本视频不卡| 国自产精品手机在线观看视频| 伊人成人在线视频| av网址在线观看免费| 欧美丝袜自拍制服另类| 欧洲精品99毛片免费高清观看| 国产精品久久一区二区三区| 91在线看国产| 国产福利在线播放麻豆| 国内精品视频在线| 毛片不卡一区二区| 亚洲第一成年免费网站| 久久综合久久八八| 久久一区激情| 在线免费国产| 欧美大片在线免费观看| 免费人成黄页网站在线一区二区| 国产超碰精品在线观看| 插插插亚洲综合网| 麻豆精品久久精品色综合| 性欧美精品孕妇| 久久久免费观看| 韩国v欧美v亚洲v日本v| 国产大学生校花援交在线播放| 欧美激情喷水视频| 国产美女在线观看一区| 国产youjizz在线| 国产成人精品电影久久久| 国产成人免费在线视频| 国产色在线观看| 亚洲伊人成综合成人网| 国产精品污污网站在线观看| 性欧美xxx69hd高清| 精品国产乱码久久久久软件 | 欧美va在线播放| 久久久影院免费| 日韩网址在线观看| 亚洲国产日韩欧美综合久久| 亚洲欧美色图| 秋霞福利视频| 久久久伊人欧美| youjizz久久| 神马午夜在线视频| 精品一区久久| 欧美自拍偷拍午夜视频| 成人久久久久| 五月婷婷导航| 欧美激情一区二区三区高清视频| 高清不卡一区二区| 亚洲欧美电影| 国产成人免费高清视频| 日韩精品最新网址| 亚洲综合精品| 国产精品va在线观看视色| 成人av电影天堂| 亚洲国产精品尤物yw在线观看| 91国内精品白嫩初高生| 免费无码国产v片在线观看| 亚洲欧美在线一区二区| 韩国av一区二区三区四区| 丰满诱人av在线播放| 就去色蜜桃综合| 在线精品观看国产| 欧美粗暴jizz性欧美20| av网页在线| 久久精品99| 日韩欧美国产一区在线观看| 99热在线精品观看| 欧美精品videosex| 制服丝袜综合日韩欧美| 日韩成人免费视频| 另类中文字幕网| 在线看片国产福利你懂的| 久久久99精品视频| 久久精品国产一区| 国产精品看片你懂得| 国产精品美女久久久久久不卡| 在线视频99| 国内精品二区| 日韩激情片免费| 久久综合色之久久综合| 欧美亚洲大陆| 日韩精品系列| 日韩国产一区久久| 亚洲系列中文字幕| 亚洲国产激情av| 日韩理论电影院| 国产最新在线| 久操网在线观看| 日本久久亚洲电影| 欧美午夜电影在线| 亚洲尤物精选| 亚洲www啪成人一区二区| 欧美性大战久久久久xxx| 久久久亚洲福利精品午夜| 亚洲精品videosex极品| 136国产福利精品导航网址| а√在线天堂官网| 不要播放器的av网站| 成人激情视频免费在线| 欧美成人一区二区三区片免费| 99riav久久精品riav| 成人vr资源| 国产福利电影在线播放| 国产精品自拍视频在线| 久久99精品久久久久久久青青日本 | 欧美一区二区视频在线观看| 久久电影网站中文字幕| 亚洲一区二区免费在线观看| 中文乱码字幕高清在线观看| 欧美日韩在线精品一区二区三区| 中文字幕av一区中文字幕天堂 | 激情综合网婷婷| 91精品久久久久久久久久另类 | 国产成人亚洲综合a∨猫咪| 欧美aaaaa级| 欧美精品电影| 女人天堂av手机在线| 91精品在线影院| 日韩毛片在线观看| 国产精品白丝在线| 性色av一区二区怡红| 日本一区二区三区播放| 国产三级在线免费观看| 成人网站免费观看入口| 丁香婷婷久久久综合精品国产| 在线观看91久久久久久| 欧美色播在线播放| 99精品欧美一区二区三区小说| 亚洲高清资源在线观看| 亚洲精品tv| 麻豆影院在线观看| 成人免费淫片| 国产成人生活片| 亚洲xxxx视频|