溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java中單例的優(yōu)缺點(diǎn)有哪些

發(fā)布時間:2021-01-18 16:05:56 來源:億速云 閱讀:181 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關(guān)java中單例的優(yōu)缺點(diǎn)有哪些,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

1.初級寫法

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

上面這種寫法,在并發(fā)環(huán)境下,會出現(xiàn)多個實(shí)例。

2.加鎖

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

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

但是,顯然,我們把整個方法都同步了,效率很低下,我們可以繼續(xù)優(yōu)化,只在創(chuàng)建實(shí)例的地方加上同步,參考5雙鎖檢驗(yàn)。

3.餓漢式

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

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

4.懶漢式

懶漢式的特點(diǎn)是:用到這個實(shí)例時才去調(diào)用方法實(shí)例化。這個和2中的看起來是一樣的,因?yàn)檫@個實(shí)例化方法加了synchronized ,這樣安全一些。

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

5.雙鎖檢驗(yàn)

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

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

package com.java4all.test6;
/**
 * Author: yunqing
 * Date: 2018/8/13
 * Description:雙鎖檢驗(yàn)
 */
public class SynchronizedSingleton {
  /**volatile防止指令重排*/
  private static volatile SynchronizedSingleton singleton;
  private SynchronizedSingleton() {
  }
  /**只是在實(shí)例為空時才進(jìn)行同步創(chuàng)建
   * 為什么做了2次判斷?
   * A線程和B線程同時進(jìn)入同步方法0
   * 然后都在1位置處判斷了實(shí)例為null
   * 然后都進(jìn)入了同步塊2中
   * 然后A線程優(yōu)先進(jìn)入了同步代碼塊2中(B線程也進(jìn)入了),然后創(chuàng)建了實(shí)例
   * 此時,如果沒有3處的判斷,那么A線程創(chuàng)建實(shí)例同時,B線程也會創(chuàng)建一個實(shí)例
   * 所以,還需要做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.內(nèi)部類

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

以上就是java中單例的優(yōu)缺點(diǎn)有哪些,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI