Java之單例項模式,懶漢和鎖校驗

2021-08-24 20:16:31 字數 1423 閱讀 1630

單例模式只能有乙個例項。

單例類必須建立自己的唯一例項。

單例類必須向其他物件提供這一例項。

單例可以繼承和被繼承,方法可以被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...