單例模式介紹
定義:乙個類只有乙個例項物件,提供乙個供系統全域性呼叫的入口。
說明:對於一些需要保持一致的或者建立例項很耗資源的類,提供乙個單例物件,避免系統占用過多記憶體。單例模式是結構比較簡單的模式,但是深入來看卻非常複雜的模式。
單例模式的結構
單例實現
根據例項的建立時間,分為餓漢模式和懶漢模式
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 ...