国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永昌县| 克拉玛依市| 漳州市| 乐东| 伽师县| 白玉县| 桓仁| 鸡泽县| 米易县| 太和县| 双辽市| 汤阴县| 井研县| 独山县| 广元市| 华坪县| 莱阳市| 老河口市| 重庆市| 青铜峡市| 安康市| 醴陵市| 缙云县| 平顶山市| 潜江市| 屏边| 通河县| 博罗县| 德钦县| 巴林右旗| 来安县| 紫金县| 梨树县| 石河子市| 衡水市| 循化| 翼城县| 古蔺县| 巴塘县| 宜春市| 英德市|