黑馬程式設計師 單例設計模式

2021-07-02 04:47:38 字數 1126 閱讀 9749

為了避免其他程式過多的建立該類物件先禁止其他程式建立該類物件。

還為了讓其他程式可以訪問該類物件,只好在本類中自定義乙個物件

為了方便讓其他程式對自定義物件的訪問,可以在外部提供乙個訪問方式

1.將建構函式私有化

2.在類中建立乙個本類物件

3.提供乙個可以讓外界獲取到該物件的方法。

說明:顧名思義,餓漢模式就是在jvm程序啟動並在我們主動使用該類的時候就會在記憶體中初始化乙個單例物件,

當我們呼叫getinstance()的時候直接獲取該物件,他的建立是在我們呼叫getinstance()靜態方法之前

懶漢模式是相對於餓漢模式而言的,在jvm程序啟動並在我們主動使用該類的時候不會在記憶體中初始化乙個單例物件,只有當我們呼叫 getinstance()的時候才去建立該物件,他的建立是在我們呼叫getinstance()靜態方法之後,為了並沒現象同步問題,我們在getinstance()方法上加了乙個鎖,這個方法每次只允許乙個執行緒進來,雖然同步問題是解決了,但是相應的效能問題就出現了。

雙鎖機制的出現是為了解決前面同步問題和效能問題,

簡單分析下確實是解決了多執行緒並行進來不會出現重複new物件,而且也實現了懶載入

但這時就有這麼一種情況了,

假如有兩個併發執行緒a、b,a執行緒主動呼叫了靜態方法getinstance(),這時開始載入和初始化該類的靜態變數,

b執行緒呼叫 getinstance()並等待獲得同步鎖,當a執行緒初始化物件過程中,

到了第二階段即連線階段的準備步驟時,靜態變數doublekey 被賦予了乙個預設值,但是這時還沒有進行初始化,

這時當a執行緒釋放鎖後,b執行緒判斷doublekey != null,則直接返回了乙個沒有初始化的doublekey 物件,

問題就出現在這裡了,b執行緒拿到的是乙個被賦予了預設值但是未初始化的物件,剛剛可以通過鎖的檢索!

黑馬程式設計師 單例設計模式

asp.net android io開發s net培訓 期待與您交流!設計要求 1.只能被例項化一次。2.由自己建立例項。3.能向該類任意引用提供上述例項。方式一 餓漢式 class single public static single getinstance 方式二 懶漢式 class sing...

黑馬程式設計師 單例設計模式

asp.net android ios開發 net培訓 期待與您交流!單例設計模式 解決乙個類在記憶體中只存在乙個物件。想要保證物件唯一。1,為了避免其他程式過多建立該類物件。先禁止其他程式建立該類物件 2,還為了讓其他程式可以訪問到該類物件,只好在本類中,自定義乙個物件 3,為了方便其他程式對自定...

黑馬程式設計師 單例設計模式

思想 1,不讓其他程式建立該類物件。2,在本類中建立乙個本類物件。3,對外提供方法,讓其他程式獲取這個物件。步驟 1,因為建立物件都需要建構函式初始化,只要將本類中的建構函式私有化,其他程式就無法再建立該類物件 2,就在類中建立乙個本類的物件 3,定義乙個方法,返回該物件,讓其他程式可以通過方法就得...