Java設計模式--單例模式

什么是單例?

確保一個類只有一個實例,并提供一個全局訪問點。

應用

線程池,緩存,數據庫等,這些類只需要一個實例,如果多個實例會造成異常的情況。

實現

懶漢式簡單的實現

public class Singleton {

    private static Singleton singleton;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (singleton == null) {//位置一
            singleton = new Singleton();
        }
        return singleton;
    }
}

簡單的實現在遇到多線程的時候就會出現問題。比如第一次創建singleton時,線程1執行位置一,這個時候線程2也要獲取一個singeton,它也執行到了位置一,然后線程1向下執行獲取到了singleton,然后線程2向下執行,singleton又重新被實例化,線程2又獲取到一個新的Singeton的實例。

  • 應對多線程,那就用synchronized方法吧,重新寫getInstance方法
    public static synchronized Singleton getInstance(){
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

使用synchronized方法修飾之后,避免了多線程的問題,那我們看看有沒有其他的問題?

synchronized 會降低性能,每次獲取實例的時候多要判斷getInstance方法有沒有執行完,但是我們只需要在第一次實例化singleton時需要synchronized。

  • 雙重檢查加鎖,在getInstance中減少synchronized,提高性能
private volatile static Singleton singleton4;//volatile關鍵字確保:當singleton變量被實例化成Singleton實例時,多個線程正確地處理singleton變量
    
    public static Singleton getInstance(){
        if (singleton == null) {//檢查實例,如果不存在,進去同步區
            synchronized (Singleton.class) {//只有第一次才徹底執行這里的代碼
                if (singleton == null) {//再次判空,
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }

以上都是懶漢式的單例,也就是延遲加載,用到Singeton實例的時候才創建一個實例。下面看看餓漢式的單例模式

private static Singleton singleton3 = new Singleton();
    
    public static Singleton getInstance(){
        return singleton;
    }

還有一種內部類的實現方式,比較常用

    private static class SingletonHolder{
        private static Singleton instance = new Singleton();
    }
    
    public static Singleton getInstance(){
        return  SingletonHolder.instance;
    }

結束語

  • 單例模式確保程序中一個類最多只有一個實例。
  • 單例模式提供一個全局訪問點。
  • 私有的構造器,一個靜態方法和一個靜態變量。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前言 本文主要參考 那些年,我們一起寫過的“單例模式”。 何為單例模式? 顧名思義,單例模式就是保證一個類僅有一個...
    tandeneck閱讀 2,538評論 1 8
  • Java設計模式——單例模式 單例模式應該是大家最為熟知的一種設計模式了,相信大家或多或少的都在自己的項目中使用過...
    gogoingmonkey閱讀 528評論 0 2
  • 今天筆試的時候被問到了單例模式,聽了很多次,但是卻沒有認真看過,所以交了白卷,懶的教訓啊!還有一題比較有趣的題目:...
    shakesbears閱讀 379評論 0 3
  • 概念 java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,比較常見的有:懶漢式單例、餓漢式單例。單例模...
    怡紅快綠閱讀 482評論 0 0
  • 從小培養理財觀念的方法 教孩子理財要趁早。如果孩子能從小養成理財的習慣,他們會終身受益。 美國兒童的理財教育從孩子...
    執著的80后閱讀 600評論 0 6