簡體   English   中英

單身和線程安全?

[英]Singleton and Thread Safety?

我目前正在開發一個“Singleton”類,但它必須承受線程安全,因為我不僅訪問,而且設置一些東西..我想知道我怎么能這樣 - 因為它似乎鎖定的東西與當我不知道它實際在做什么以及我是否必須使每一個方法線程都安全時, lock(object)感覺有點hacky?

到目前為止,我有這個非線程安全的代碼 - 因為在每個線程中應該訪問相同的數據。 我怎樣才能最好地保證線程安全並保持單身?

public class AppSession() {
    private static AppSession _instance = new AppSession();
    public static AppSession Instance { get { return _instance; } }

    private AppSession() { }

    private string _actionName = "none";
    private DateTime? _actionTime = null;        
    public void ActionExecuted(string action) {
        _actionName = action ?? String.Empty;
        _actionTime = DateTime.UtcNow;
    }

    public LastAction {
       get { return $"{_action} at {_actionTime?.Value.ToString()}"; }
    }
}
  1. 首先,我將首先調整您的Singleton以使用.NET庫中的Lazy<T>類。 Lazy<T>為延遲初始化提供支持”,如MSDN文檔所述,它還提供了一個bool參數isThreadSafe ,當為true時,“使實例可由多個線程同時使用”。

     private static Lazy<AppSession> _instance = new Lazy<AppSession>( () => new LazyAppsession(), isThreadSafe: true ); 
  2. 其次,我將Lazy<AppSession>標記為readonly ,這樣任何方法或代碼都不能覆蓋_instance字段的值。

  3. 至於ActionExecuted方法,我不知道你是否仍然需要通過鎖定它來使這一個線程安全...這是我想的東西,但不要接受我的話 - 我希望其他的可以延伸我的答案 - 我也想知道自己!

因此,你的課將看起來像這樣 - 但我不確定ActionExecuted方法,正如我所說,我認識的唯一可以理解的人是@JonSkeet。

public class AppSession() {
    private static readonly Lazy<AppSession> _instance = 
        new Lazy<AppSession>(
            () => new LazyAppsession(), isThreadSafe: true
        );
    public static AppSession Instance { 
        get { return _instance.Value; } 
    }

    private AppSession() { }

    private string _actionName = "none";
    private DateTime? _actionTime = null;        
    public void ActionExecuted(string action) {
        _actionName = action ?? String.Empty;
        _actionTime = DateTime.UtcNow;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM