單例模式只能有乙個例項。
單例類必須建立自己的唯一例項。
單例類必須向其他物件提供這一例項。
單例可以繼承和被繼承,方法可以被override,而靜態方法不可以。
靜態方法中產生的物件會在執行後被釋放,進而被gc清理,不會一直存在於記憶體中。
靜態類會在第一次執行時初始化,單例模式可以有其他的選擇,即可以延遲載入。
基於2, 3條,由於單例物件往往存在於dao層(例如sessionfactory),如果反覆的初始化和釋放,則會占用很多資源,而使用單例模式將其常駐於記憶體可以更加節約資源。
靜態方法有更高的訪問效率。
單例模式很容易被測試。
public class
userdao
public static userdao getinstance()
return instance;
}}
分析:
這段**在單執行緒中是沒有什麼問題的,但因為沒有鎖機制,在多執行緒下就出現問題,當同一時候有兩個或以上的執行緒進入getinstance()這個方法時,因為剛開始時getinstance是null,而幾個執行緒都是第一時間到達了這個方法裡,所以if條件都滿足,就會出現新建出不是唯一的instance物件,下面是用多執行緒測試的**,如果會生成多個物件,則會出現列印」我的新的例項」。
public class
thead1
implements
runnable ;
}
public static void main(string args)
多次執行,則可能出現多次」我是新的例項的輸出」
我是新的例項於是就有了校驗鎖法來針對這個執行緒安全問題我是新的例項
示例
public class
userdao
public static userdao getinstance()
}return instance;
}
}
儘管這樣做到了執行緒安全,並且解決了多例項問題,但並不高效。在任何呼叫這個方法的時候,你都需要承受同步帶來的效能開銷,然而同步只在第一次呼叫的時候才被需要,也就是單例類例項建立的時候。這將促使我們使用雙重檢查鎖模式(double checked locking pattern),一種只在臨界區**加鎖的方法。程式設計師稱其為雙重檢查鎖,因為會有兩次檢查 _instance == null,一次不加鎖,另一次在同步塊上加鎖。
public class
userdao
public static userdao getinstance()}}
return instance;
}}
單例模式之懶漢模式 Java實現
單例設計模式 應用場合 有些物件只需要乙個就足夠了 作用 保證整個應用程式中某個例項有且只有乙個 型別 餓漢模式 懶漢模式 二 單例模式之懶漢模式 public class singleton2 2.建立類的唯一例項 不去例項化 private static singleton2 instance ...
java單例模式懶漢和餓漢
實現 1 公開靜態的對外訪問方法 2 私有的構造方法 保證不被外部呼叫 3 類載入時候建立物件 餓漢式 public class instance1 private static instance1 d new instance1 private instance1 public static in...
java 單例模式 懶漢和餓漢
確保乙個類只有乙個例項,並提供乙個全域性訪問點。package wfb.pattern public class singleton public static singleton getinstance return instance package wfb.pattherntest import...