溫馨提示×

溫馨提示×

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

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

java單例模式如何寫

發(fā)布時間:2020-09-17 09:40:26 來源:億速云 閱讀:139 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關java單例模式如何寫,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一。這種類型的設計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。

這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

注意:

1、單例類只能有一個實例。2、單例類必須自己創(chuàng)建自己的唯一實例。3、單例類必須給所有其他對象提供這一實例。

java 單例模式5種寫法:

飽漢模式(懶漢模式)

// 飽漢
// UnThreadSafe
public class Singleton1 {
  private static Singleton1 singleton = null;
  private Singleton1() {
  }
  public static Singleton1 getInstance() {
    if (singleton == null) {
      singleton = new Singleton1();
    }
    return singleton;
  }
}

優(yōu)點:懶加載啟動快,資源占用小,使用時才實例化,無鎖。

缺點:非線程安全。

飽漢模式(懶漢模式)--線程安全

public class Singleton {
    /**
     * 定義一個變量來存儲創(chuàng)建好的類實例
     */
    private static Singleton uniqueInstance = null;
    /**
     * 私有化構造方法,好在內(nèi)部控制創(chuàng)建實例的數(shù)目
     */
    private Singleton(){
    }
    /**
     * 定義一個方法來為客戶端提供類實例
     * @return 一個Singleton的實例
     */
    public static synchronized Singleton getInstance(){
        //判斷存儲實例的變量是否有值
        if(uniqueInstance == null){
            //如果沒有,就創(chuàng)建一個類實例,并把值賦值給存儲類實例的變量
            uniqueInstance = new Singleton();
        }
        //如果有值,那就直接使用
        return uniqueInstance;
    }
    /**
     * 示意方法,單例可以有自己的操作
     */

    public void singletonOperation(){
//功能處理
    }
    /**
     * 示意屬性,單例可以有自己的屬性
     */
    private String singletonData;
    /**
     * 示意方法,讓外部通過這些方法來訪問屬性的值
     * @return 屬性的值
     */
    public String getSingletonData(){
        return singletonData;
    }
}

優(yōu)點:同上,但加鎖了。

缺點:synchronized 為獨占排他鎖,并發(fā)性能差。即使在創(chuàng)建成功以后,獲取實例仍然是串行化操作。

飽漢模式(懶漢模式)--雙重加鎖檢查DCL(Double Check Lock)

public class Singleton {
    /**
     * 對保存實例的變量添加volatile的修飾
     */
    private volatile static Singleton instance = null;
    private Singleton(){
    }

    public static Singleton getInstance(){
//先檢查實例是否存在,如果不存在才進入下面的同步塊
       if(instance == null){
//同步塊,線程安全的創(chuàng)建實例
            synchronized(Singleton.class){
//再次檢查實例是否存在,如果不存在才真的創(chuàng)建實例
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

優(yōu)點:懶加載,線程安全。

注:實例必須有 volatile 關鍵字修飾,其保證初始化完全。

餓漢模式

public class Singleton {
//4:定義一個靜態(tài)變量來存儲創(chuàng)建好的類實例
//直接在這里創(chuàng)建類實例,只會創(chuàng)建一次
    private static Singleton instance = new Singleton();
//1:私有化構造方法,好在內(nèi)部控制創(chuàng)建實例的數(shù)目
    private Singleton(){
    }
//2:定義一個方法來為客戶端提供類實例
//3:這個方法需要定義成類方法,也就是要加static
//這個方法里面就不需要控制代碼了
   public static Singleton getInstance(){
//5:直接使用已經(jīng)創(chuàng)建好的實例
       return instance;
    }
}

優(yōu)點:餓漢模式天生是線程安全的,使用時沒有延遲。

缺點:啟動時即創(chuàng)建實例,啟動慢,有可能造成資源浪費。

Holder模式

public class Singleton {
    /**
     * 類級的內(nèi)部類,也就是靜態(tài)的成員式內(nèi)部類,該內(nèi)部類的實例與外部類的實例
     * 沒有綁定關系,而且只有被調(diào)用到才會裝載,從而實現(xiàn)了延遲加載
     */
    private static class SingletonHolder{
        /**
         * 靜態(tài)初始化器,由JVM來保證線程安全
         */
        private static Singleton instance = new Singleton();
    }
    /**
     * 私有化構造方法
     */
    private Singleton(){
    }
    public static  Singleton getInstance(){
        return SingletonHolder.instance;
    }
}

優(yōu)點:將懶加載和線程安全完美結合的一種方式(無鎖)。

關于java單例模式如何寫就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

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

AI