單例模式 懶漢模式

2021-08-20 03:00:59 字數 1332 閱讀 4282

在實際應用中,我們往往希望在使用的時候才進行類的載入,而不希望類初始化的時候就進行載入,所以單例模式又有了另外一種實現,懶漢模式

一.延遲載入**如下

public class myobject 

public static myobject getinstance()

return myobject;

}}

延遲載入,就是如果myobject.getinstance()不被呼叫的話,jvm裡面永遠不會有myobject例項。

如果myobject.getinstance()被呼叫的話,程式會先判斷myobject是否為null,若為null,則呼叫私有構造方法建立乙個myobject例項。很明顯,在多執行緒的情況下,會出現多個執行緒同時進行myobject==null的判斷,進而建立多個例項,這就違反了單例模式的原則,後續會進行優化

優點:延遲載入

缺點:執行緒不安全

二.單例模式優化

針對上述情況中,在多執行緒環境下產生多個例項的問題,最直接的改善形式就是給方法加鎖,這樣當多個執行緒同時訪問該方法時,就會進行排隊

**如下

public class myobject 

public static synchronized myobject getinstance()

return myobject;

}}

在getinstance()方法前加synchronized關鍵字,對getinstance()方法進行加鎖,保證一次只能有乙個執行緒對getinstance()方法進行訪問,但此時,同樣存在問題,什麼問題,效率的問題,如果存在多次呼叫getinstance()的情況,會由於排隊,產生很大的效率影響。

優點:延遲載入,執行緒安全

缺點:效率低下

三.單例模式再次優化

我們希望的是在進行初始化的時候,只載入乙個例項,即對改方法進行加鎖,但是我們後續呼叫的時候,不需要對該方法進行加鎖,就有了如下的優化

public class myobject 

public static myobject getinstance() }}

return myobject;

}}

為何會在synchronized中再加乙個null的判斷,如果不加第二個null判斷,在多執行緒的情況下,多個執行緒已經進入第一層null的判斷,然後排隊獲得鎖,當第乙個執行緒獲取鎖後,進行myobject的載入,然後釋放鎖,其他執行緒此時可以直接獲得該物件,但由於沒有第二層null判斷,此時還是會進行myobject的載入。

此時的懶漢模式既實現了延遲載入,又提高了訪問效率,且是執行緒安全的。

單例模式 懶漢模式

因為在設計或開發中,肯定會有這麼一種情況,乙個類只能有乙個物件被建立,如果有多個物件的話,可能會導 致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使 用的情形也不相同。今天要實現的是常用的三種,分別是餓漢式 懶漢式和多執行緒式。單例模式的要點有三...

懶漢單例模式

單例設計模式 懶漢單例模式 能夠保證在只有用它的時候才建立它的物件。目前還不能保證乙個類在記憶體中只有乙個物件。懶漢單例模式設計步驟 1 私有化建構函式 2 生命本類的引用型別變數,但是不要建立物件 3 提供公共的靜態方法獲取本類的物件,獲取之前先判斷是否已經建立了本類的物件,如果已經建立了,那麼直...

單例模式 懶漢

1 執行緒不安全 執行緒不安全 public class private private 雙重檢測 鎖 return public 2 執行緒安全 雙重檢測 鎖 volatile 執行緒安全 public class private static private 雙重檢測 鎖 volatile re...