單例模式記錄

2021-09-13 11:47:18 字數 1233 閱讀 8402

單例模式就是保證在整個應用程式的生命週期中,在任何時刻,被指定的類只有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。

一、經典模式:

public class singleton

public static singleton getinstance()

return instance;

}}  解析如下:

1)首先,該singleton的建構函式必須是私有的,以保證客戶程式不會通過new()操作產生乙個例項,達到實現單例的目的;

2)因為靜態變數的生命週期跟整個應用程式的生命週期是一樣的,所以可以定義乙個私有的靜態全域性變數instance來儲存該類的唯一例項;

3)必須提供乙個全域性函式訪問獲得該例項,並且在該函式提供控制例項數量的功能,即通過if語句判斷instance是否已被例項化,如果沒有則可以同new()建立乙個例項;否則,直接向客戶返回乙個例項。

在這種經典模式下,沒有考慮執行緒併發獲取例項問題,即可能出現兩個執行緒同時獲取instance例項,且此時其為null時,就會出現兩個執行緒分別建立了instance,違反了單例規則。因此,需對上面**修改。

二、多執行緒下的單例模式

1、lazy模式

public class singleton

public static singleton getinstance()}}

return instance;

}}

上述**使用了雙重鎖方式較好地解決了多執行緒下的單例模式實現。先看內層的if語句塊,使用這個語句塊時,先進行加鎖操作,保證只有乙個執行緒可以訪問該語句塊,進而保證只建立了乙個例項。再看外層的if語句塊,這使得每個執行緒欲獲取例項時不必每次都得加鎖,因為只有例項為空時(即需要建立乙個例項),才需加鎖建立,若果已存在乙個例項,就直接返回該例項,節省了效能開銷。

2、餓漢模式

這種模式的特點是自己主動例項。

public sealed class singleton

public static singleton getinstance()

}

上面使用的readonly關鍵可以跟static一起使用,用於指定該常量是類別級的,它的初始化交由靜態建構函式實現,並可以在執行時編譯。在這種模式下,無需自己解決執行緒安全性問題,clr會給我們解決。由此可以看到這個類被載入時,會自動例項化這個類,而不用在第一次呼叫getinstance()後才例項化出唯一的單例物件。

單例模式的記錄

1.餓漢式 1 class single 3private static final single s new single 45 public static single getinstance 8 2.懶漢式 1 class single 3private static single s nul...

單例設計模式記錄

一 懶漢式 1,執行緒不安全 public class singleton public static singleton getinstance return instance 2,執行緒安全 public class singleton public static singleton getin...

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...