聊聊設計模式的單例模式

2021-10-24 05:39:22 字數 1728 閱讀 6768

單例模式介紹

定義:乙個類只有乙個例項物件,提供乙個供系統全域性呼叫的入口。

說明:對於一些需要保持一致的或者建立例項很耗資源的類,提供乙個單例物件,避免系統占用過多記憶體。單例模式是結構比較簡單的模式,但是深入來看卻非常複雜的模式。

單例模式的結構

單例實現

根據例項的建立時間,分為餓漢模式和懶漢模式

public

class

eagersingleton

public

static eagersingleton getinstance()

}

public

class

lazysingleton

public

static lazysingleton getinstance()

return bean;

}}

getinsatnce方法裡面,會判斷bean是否為空,如果為空則會建立該物件,那麼如果是在多執行緒的呼叫環境中,如果某個執行緒在執行bean = new lazysingleton()**時,剛好有其他執行緒在呼叫getinstance方法,並且此時前乙個前程的bean還沒建立成功,則該執行緒也會再一次執行建立操作,所以可以看出這個這種實現是執行緒不安全的。

我們用乙個場景類來驗證一下。

public

static

void

main

(string[

] args));

} executors.

shutdown()

;}

獲取到的例項物件為:pattern.lazysingleton@3f2d920f

獲取到的例項物件為:pattern.lazysingleton@222ee9a2

獲取到的例項物件為:pattern.lazysingleton@222ee9a2

獲取到的例項物件為:pattern.lazysingleton@222ee9a2

獲取到的例項物件為:pattern.lazysingleton@222ee9a2

獲取到的例項物件為:pattern.lazysingleton@222ee9a2

獲取到的例項物件為:pattern.lazysingleton@222ee9a2

...

優化方法

針對上述問題,可以通過使用餓漢模式來實現,或者通過加鎖來保證多執行緒的執行問題。

public

class

lazysingleton

public

static

synchronized lazysingleton getinstance()

return bean;

}}

這裡進行了加鎖機制,確保了執行緒安全問題,但是這裡會有一定的效能損耗,每次執行緒都需要等待鎖釋放後才能呼叫該方法。實際上這裡只要確保物件被建立時只有乙個執行緒成功呼叫,而一旦物件唄建立成功後,這裡就不需要進行加鎖機制了。所以這裡可以選擇在方法內部進行加鎖,在條件判斷裡面。

public

class

lazysingleton

public

static lazysingleton getinstance()

}}return bean;

}}

簡單聊聊設計模式之單例模式

開閉原則 黎克特制代換原則 依賴倒轉原則 介面隔離原則 迪公尺特原則 又稱最少知道原則 合成復用原則 優點 缺點 懶漢式 classname demo description todo 懶漢式,使用double checking雙重檢查以及volatile關鍵字保證執行緒安全以及禁止指令重排 aut...

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...

設計模式 單例模式

class testsingleton static public function instance return self testsingleton private function clone public function setsinvar sinvar public function ...