設計模式 單例模式

2021-12-29 20:27:06 字數 2118 閱讀 9673

類只存在乙個例項,即只可以建立乙個物件。有一些類如果創造出多個物件就會導致許多問題的產生,如程式的行為異常、資源使用過量,或者是不一致的結果。單件模式常常被用來管理共享的資源,例如資料庫連線或者執行緒池。

簡要定義:單件模式確保乙個類只有乙個例項,並提供乙個全域性訪問點

單件模式的實現是通過private建構函式,類中含有乙個靜態方法getinstance(),呼叫這個方法可以建立並返回唯一的物件,也可能返回的是已經建立好的物件。

分析:單件模式,首先要限制從外部建立物件,所以將構造方法宣告為私有private,這樣就只能在類內部呼叫建構函式。如何呼叫這個建構函式?要使用這個類,而又沒有這個類的物件,所以需要乙個靜態的方法,這個方法呼叫私有的建構函式,並且返回唯一的單件物件。

剖析經典單件模式的實現

下面是經典單件模式的實現: 

public class singleton

public static singleton getinstance()

return singleton;

}}這種實現方式存在問題,在多執行緒的情況下,可能會建立多個物件。我們可以通過增加synchionized關鍵字到getinstance方法中,迫使每個執行緒在進入這個方法之前,要先等候別的程序離開該方法。

public class singleton

public static synchionized singleton getinstance()

return singleton;

}這樣的同步可能會造成效能問題,改善途徑有兩種:

1.使用「急切」建立例項,而不用延遲例項化的做法:

public class singleton

public static singleton getinstance()

}利用這個做法,我們依賴jvm在載入在載入這個類時馬上建立唯一的單件例項.jvm保證在任何執行緒訪問uniqueinstance靜態變數之前,一定先建立此例項

如果我們希望他能在我第一次getinstance()時才被真正的建立。這樣,我們可以控制真正的類建立的時刻,而不是把類的建立委託給了類裝載器。可以用如下版本實現:

public class singleton

privatesingleton (){}

public static final singleton getinstance()

}上面這種方式,仍然使用jvm本身機制保證了執行緒安全問題;由於 singletonholder 是私有的,除了 getinstance() 之外沒有辦法訪問它,因此它只有在getinstance()被呼叫時才會真正建立;同時讀取例項的時候不會進行同步,沒有效能缺陷;也不依賴 jdk 版本。

2.使用"雙重檢查加鎖「,在getinstance中減少使用同步:

首先檢查是否例項已經建立了,如果未建立,才進行同步,這樣一來,只有第一次會同步。

public class singleton

public static singleton getinstance()

}} return uniqueinstance;

}}volatile關鍵字的作用就是確保當uniqueinstance變數被初始化成singleton例項時,多個執行緒正確地處理uniqueinstance變數

需要把singleton宣告成成 volatile 這是因為:singleton= new singleton()這句,這並非是乙個原子操作,事實上在 jvm 中這句話大概做了下面 3 件事情。

給 singleton 分配記憶體呼叫 singleton 的建構函式來初始化成員變數,形成例項將singleton物件指向分配的記憶體空間(執行完這步 singleton才是非 null 了)

但是在 jvm 的即時編譯器中存在指令重排序的優化。也就是說上面的第二步和第三步的順序是不能保證的,最終的執行順序可能是 1-2-3 也可能是 1-3-2。如果是後者,則在 3 執行完畢、2 未執行之前,被執行緒二搶占了,這時 instance 已經是非 null 了(但卻沒有初始化),所以執行緒二會直接返回 instance,然後使用,然後順理成章地報錯。

設計模式 單例模式

單例模式 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 ...

設計模式 單例模式

單例模式的目的是保證類在系統中只被例項化一次,由該唯一的例項來為系統提供服務.單例模式主要用於保證服務的統一,比如獲取統一的編號服務,模仿oracle的序列生成等.但單例的使用需要謹慎,特別是在需要作負載均衡的地方,因為這種程式級的單例模式實際上只能保證在乙個應用中為單例.如果被多個應用載入,還是會...