麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > Java > 正文

詳解java中的6種單例寫法及優缺點

2024-07-14 08:42:59
字體:
來源:轉載
供稿:網友

在java中,單例有很多種寫法,面試時,手寫代碼環節,除了寫算法題,有時候也會讓手寫單例模式,這里記錄一下單例的幾種寫法和優缺點。

1.初級寫法
2.加鎖
3.餓漢式
4.懶漢式
5.雙鎖檢驗
6.內部類

1.初級寫法

package com.java4all.test6;/** * Author: yunqing * Date: 2018/8/13 * Description:單例模式 -- 初級 */public class Singleton {  private static Singleton singleton = null;  public Singleton() {  }  /**并發下會產生多個實例*/  public static Singleton getInstance(){    if(singleton == null){      singleton = new Singleton();    }    return singleton;  }}

上面這種寫法,在并發環境下,會出現多個實例。

2.加鎖

我們優化上面的代碼,遇到并發,很容易想到加鎖,把獲取對象的方法加上關鍵字synchronized,很巧,這種寫法也稱為懶漢式單例 ,如下:

package com.java4all.test6;/** * Author: yunqing * Date: 2018/8/13 * Description: */public class BadSynchronizedSingleton {  private static BadSynchronizedSingleton synchronizedSingleton;  private BadSynchronizedSingleton() {  }  /**   * 缺點:等待時間長   * 這種整個方法都同步了,效率很低   * */  public synchronized static BadSynchronizedSingleton getInstance(){    if(synchronizedSingleton == null){      synchronizedSingleton = new BadSynchronizedSingleton();    }    return synchronizedSingleton;  }}

但是,顯然,我們把整個方法都同步了,效率很低下,我們可以繼續優化,只在創建實例的地方加上同步,參考5雙鎖檢驗。

3.餓漢式

餓漢式的特點是:類在加載時就直接初始化了實例。即使沒用到,也會實例化。

package com.java4all.test6;/** * Author: yunqing * Date: 2018/8/13 * Description:餓漢式單例模式--類初始化時就自行實例化 */public class ESingleton {  /**類在加載的時候直接進行初始化*/  private static final ESingleton ESINGLETON = new ESingleton();  private ESingleton() {}  /**對外暴露唯一接口 提供單例對象*/  public static ESingleton geteSingleton(){    return ESINGLETON;  }}

4.懶漢式

懶漢式的特點是:用到這個實例時才去調用方法實例化。這個和2中的看起來是一樣的,因為這個實例化方法加了synchronized ,這樣安全一些。

package com.java4all.test6;/** * Author: yunqing * Date: 2018/8/13 * Description:懶漢式單例模式 * 第一次調用時實例化 */public class BSingleton {  private static BSingleton bSingleton ;  private BSingleton() {  }  /**   * 整個方法鎖住了,效率較低   * @return   */  public synchronized static BSingleton getbSingleton(){    if(bSingleton == null){      bSingleton = new BSingleton();    }    return bSingleton;  }}

5.雙鎖檢驗

雙重非空判斷,new對象前加一次鎖。

volatile關鍵字,考慮的是,new關鍵字在虛擬機中執行時其實分為很多步驟,具體原因可以參考深入理解java虛擬機一書(考慮的是這個new關鍵字字節碼執行時是非原子性的),而volatile關鍵字可以防止指令重排。

package com.java4all.test6;/** * Author: yunqing * Date: 2018/8/13 * Description:雙鎖檢驗 */public class SynchronizedSingleton {  /**volatile防止指令重排*/  private static volatile SynchronizedSingleton singleton;  private SynchronizedSingleton() {  }  /**只是在實例為空時才進行同步創建   * 為什么做了2次判斷?   * A線程和B線程同時進入同步方法0   * 然后都在1位置處判斷了實例為null   * 然后都進入了同步塊2中   * 然后A線程優先進入了同步代碼塊2中(B線程也進入了),然后創建了實例   * 此時,如果沒有3處的判斷,那么A線程創建實例同時,B線程也會創建一個實例   * 所以,還需要做2次判斷   * */  public static SynchronizedSingleton getInstance(){//0    if(singleton == null){//1      synchronized (SynchronizedSingleton.class){//2        if(singleton == null){//3          singleton = new SynchronizedSingleton();//4        }      }    }    return singleton;  }}

6.內部類

package com.java4all.test6;/** * Author: yunqing * Date: 2018/9/15 * Description:靜態內部類 * 優點:1.延遲,外部類初始化時不會進行實例創建,要用時才會創建 *   2.安全,靜態成員變量 */public class FSingleton {  private FSingleton() {  }  public static FSingleton getInstance(){    return Singleton.fSingleton;  }  private static class Singleton{    private static FSingleton fSingleton = new FSingleton();  }}

總結

以上所述是小編給大家介紹的java中的6種單例寫法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美日韩免费看 | 97香蕉超级碰碰久久免费软件 | 亚洲成人欧美在线 | 九一免费在线观看 | 国产一级毛片高清视频 | 欧美a在线观看 | 一级尻逼视频 | 久久精品伊人网 | h视频免费观看 | 香蕉视频1024 | 欧美性猛交xxx乱大交3蜜桃 | 久久精品国产99久久久古代 | 黄色7777 | asiass极品裸体女pics | 全免费午夜一级毛片真人 | 亚洲无av| av电影在线观看免费 | 日韩.www | 亚洲精品成人久久久 | 成人视屏在线 | 国产999视频在线观看 | 亚洲第一视频在线 | 成人在线视频免费 | av在线1| 经典三级av在线 | 韩国精品一区二区三区四区五区 | 九九视屏 | 国产噜噜噜| 国产免费一级淫片a级中文 99国产精品自拍 | 毛片在哪看| 中文字幕在线观看免费视频 | 国产一区视频在线观看免费 | 国产精品69久久 | 免费黄色欧美视频 | 日韩视频一区二区三区四区 | 国产羞羞视频在线观看免费应用 | av电影免费播放 | 337p日本欧洲亚洲大胆精蜜臀 | 久久久一区二区三区四区 | 欧美精品一区二区久久 | 精品亚洲综合 |