如何寫出乙個效能優化的單例模式

2022-05-07 02:09:07 字數 2260 閱讀 1443

單例模型是面試當中最常見的一種設計模式,它是一種物件建立模式,用於產生乙個物件的具體例項,可以確保系統中乙個類只產生乙個例項。

簡而言之,單例模式可以帶來兩個好處:

1、對於頻繁使用到的物件,可以節省反覆建立物件花費的時間;

2、減少物件的例項化操作,故而可以降低系統記憶體的使用頻率;

根據以上兩點,可看出使用單例模式能夠有效地改善系統的效能。

最常見的單例模式有餓漢模式與懶漢模式。

1、餓漢模式長這樣的:

1

public

class

singleton45

private

static

final singleton instance=new

singleton();67

public

static

singleton getinstance()

11 }

這種單例模式非常簡單,唯一不足的是,無法對instance例項做延遲載入,由於instance成員變數是static定義的,因此jvm在載入單例類時,單例物件就會被建立,如果這個單例類在系統中還包含了其他的靜態方法,每次通過這個單例類去呼叫其他的靜態方法時,就會載入被static定義的成員變數,也就是載入了private static final singleton instance=new singleton(),故而就會建立乙個singleton例項出來,可以通過乙個例子來進行說明:

1

public

class

singleton78

private

static

final singleton instance=new

singleton();910

public

static

singleton getinstance()

1415

public

static

void

test()

1920 }

列印出這樣的資訊:

由此可見,餓漢模式因為沒有延遲載入機制,存在著物件容易被建立的問題,這將會影響系統在呼叫相關函式時的反應速度,可以加入延遲載入機制來解決這個問題。

加了延遲機制的單例模式,就成了我們常見的懶漢模式了,但這裡加了同步安全機制:

1

public

class

singletonsyn67

private

static singletonsyn instance=null;8

9public

static

synchronized

singletonsyn getinstance()

15 }

這裡需注意的地方是:getinstance()方法必須是同步的,否則在多執行緒環境下,當執行緒1正新建單例時,完成操作賦值時,執行緒2可能判斷instance為null,故執行緒2也將啟動新建單例程式,這樣就會導致多個例項被建立,對效能的影響將會加劇,故加synchronized

做同步是必須的。

可謂成也蕭何敗也蕭何,雖然加上了同步關鍵字synchronized 可以解決同步問題,但因在多執行緒的環境下,它的效能消耗將遠遠大於第一種餓漢模式。

基於前面兩種單例模式,可以對它做進一步的改進:

1

public

class

singleton45

private

static

class

singletonholder910

public

static

singleton getinstance()

15 }

上面的例子使用內部類來維護單例的例項,當singleton被載入時,其內部類並不會被初始化,故可以確保當singleton類被載入jvm時,不會初始化單例類,只有當getinstance()被呼叫時,才會載入內部類singletonholder,從而例項化單例類instance。同時,由於例項的建立是在類載入時才完成的,故天生對多執行緒友好,getinstance方法也無需使用同步synchronized

,可見,使用內部類方式實現單例,既可以做到延遲載入,也不必使用同步關鍵字,是一種比較完善的實現。

當然,若需更加完善單例模式的設計,還有更優的方式,感興趣的夥伴可以繼續深入進行乙個**。

如何寫出乙個好的單例模式

單例模式是設計模式中總容易理解,並且使用次數比較多的模式,往往在面試中會被問到。在這裡我簡述下自己的思路。希望能對你有所幫助。懶漢式 單例模式 public class single public static single getinstance return instance 複製 上面這種,是...

教你如何寫出乙個碎片輪播

對於幾乎每乙個入行前端的小夥伴來說,輪播圖幾乎都是必修課,但是,只是單純的切換過渡可能並不能滿足於你追求酷炫的心hh,那麼這裡就教你利用css3的clip path來模擬碎片並為你的輪播圖新增碎片輪播的效果!對於一張來說,如果在原有的基礎上新增一層蒙版,遮蔽住不想讓使用者見到的檢視,剩下的檢視即可作...

單例模式的效能優化

單例模式 public class singleton 宣告static,在jvm載入單例類時,單例物件就會被建立 private static singleton singletion new singleton public static singleton getinstance 中,由於jv...