在實際應用中,我們往往希望在使用的時候才進行類的載入,而不希望類初始化的時候就進行載入,所以單例模式又有了另外一種實現,懶漢模式
一.延遲載入**如下
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...