單例模式的五種方式

2021-10-24 15:15:37 字數 2743 閱讀 9636

核心作用:保證乙個類只有乙個例項,並且提供了乙個訪問該例項的全域性訪問點。

常見應用場景:

單例模式的優點:

常見的五種單例模式:

主要其他

延遲載入(lazy load)也稱為懶載入。

簡單來說,就是只有在使用的時候,才去呼叫或載入。

是延遲載入。

**實現:

//懶漢式 單例模式

public

class

singletondemo2

//方法同步,呼叫效率低

public

static

synchronized singletondemo2 getinstance()

return instance;

}}

解釋及優缺點:

**中的getinstance方法加了synchronized 鎖,是懶漢式執行緒安全的寫法,但效率不高。

不加鎖,是執行緒不安全方式的寫法,嚴格意義上講,不算單例模式。假如有兩個執行緒a,b,同時呼叫getinstance方法,由於沒有synchronized鎖,有可能出現:執行緒a判斷為null後被掛起,不new物件;然後執行執行緒b,發現也為空,new了物件;此時執行緒a被喚醒,接著執行new物件**,現在就是兩個物件了,違反單例模式定義。

優點:延遲載入(lazy load),真正用的時候才載入。

缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。

不是延遲載入。

**實現:

//餓漢式 單例模式

public

class

singletondemo1

//獲取唯一可用的物件

public

static singletondemo1 getinstance()

}

解釋及優缺點:

餓漢式單例模式在類singletondemo1載入時就初始化,並建立單例物件,絕對執行緒安全。

構造器私有化後,就不能通過new獲取物件了。

優點:沒有加鎖,執行效率會提高。

缺點:由於類載入時就初始化,如果沒有呼叫該類,會造成資源浪費。

jdk1.5 起

是延遲載入。

**實現:

// 雙檢鎖/雙重校驗鎖 dcl,即 double-checked locking

public

class

singletondemo3

;public

static singletondemo3 getinstance()

}}return instance;

}}

解釋及優缺點:

採用雙鎖機制,安全且在多執行緒情況下能保持高效能。

進行了兩次的判斷,第一次是為了避免不要的例項,第二次是為了進行同步,避免多執行緒問題。

由於instance = new singletondemo3();物件的建立在jvm中可能會進行重排序,在多執行緒訪問下存在風險,使用volatile修飾instance例項變數有效,解決該問題。

實現比較困難,一般不推薦使用

是延遲載入。

**實現:

public

class

singletondemo4

private

singletondemo4()

public

static singletondemo4 getinstance()

}

解釋及優缺點:

singletondemo4類被裝載了,instance不會被例項化singletonholdyanshijiazer類沒有被主動使用,只有通過getinstance方法才會顯式裝載 singletonholder 類,從而例項化 instance。不像餓漢式那樣立即載入。

靜態內部類方式能達到雙檢鎖方式一樣的功效,但實現更簡單。

如果想要例項化instance,但又想讓它延遲載入,不想在類初始化的時候就被例項化,這種比較合適。

對靜態域使用延遲初始化,應使用這種方式而不是雙檢鎖方式。

這種方式只適用於靜態域的情況,雙檢鎖方式可在例項域需要延遲初始化時使用。

jdk1.5 起

不是延遲載入。

**實現:

public

enum singletondemo5

}//測試類

class

test5

}

解釋及優缺點:

實現簡單

這種實現方式還沒有被廣泛採用,但這是實現單例模式的最佳方法。

它更簡潔,自動支援序列化機制,絕對防止多次例項化,避免反射和反序列化問題。

最後:

建議使用第 2種餓漢方式。如果有明確要求延遲載入的時候,建議使用第 5種靜態內部類方式。若涉及到反序列化建立物件時,大家也可以嘗試使用列舉方式。

單例模式的五種實現方式

1.最容易想到的方式 public class singleton public static singleton getinstance public static void main string args 優點是 簡單 缺點是 無論用沒用到instsnce,都會進行初始化。2.延遲載入 laz...

單例模式的五種實現方式

單例模式 無論在什麼時候,該類只有乙個例項。實現單例模式的要點就是提供乙個私有的無參建構函式。一 餓漢單例模式public class singleobject public static singleobject getinstance 二 懶漢單例模式 懶漢的意思就是慢悠悠的,不著急,也就是在呼...

五種單例模式

import settings class mysql instance none 原始狀態設為none def init self,ip,port self.ip ip self.port port classmethod deffrom conf cls if cls.instance is n...