簡體   English   中英

此方法是線程安全的嗎?

[英]Is this Method Thread-Safe?

有人可以告訴我以下方法是否線程安全。 另外,請假定對_cache.GetOrCreate(...)的調用是線程安全的。 此方法僅在創建或更新區域(詞典)的應用程序中。 包含此方法的類為單例,因此多個線程將訪問它。

    public IEnumerable<string> GetReportLookupItems<T>(string cacheKey, Func<IEnumerable<string>> factory)
    {
        Dictionary<string, IEnumerable<string>> region = _cache.GetOrCreate("Cache-Region:LookupItems", () => new Dictionary<string, IEnumerable<string>>());

        IEnumerable<string> items;

        if (!region.TryGetValue(cacheKey, out items))
        {
            region[cacheKey] = items = factory();
        }

        return items;
    }     

不。絕對不是線程安全的。

您在此處使用Dictionary<T,U>並更改其內容。 由於Dictionary<T,U>不是線程安全的,因此對TryGetValue的調用和通過鍵設置字典的操作不是線程安全的。

如果將其更改為使用線程安全的字典(例如ConcurrentDictionary<T,U> ),則可能使它成為線程安全的方法。

我會說這取決於_cache.GetOrCreate所做的事情。

但是從它的聲音來看,由於它正在訪問同一Dictionary ,因此它聽起來不是線程安全的。

不,此代碼不是線程安全的,因為在共享字典上調用實例方法TryGetValue (由_cache.GetOrCreate返回)不是線程安全的。 多個線程可能同時在同一字典實例上調用此實例方法。

它不是線程安全的。

線程1一直執行到region [cacheKey] = items = factory();。

線程#2搶占了線程#1

線程2一直執行到region [cacheKey] = items = factory();。

線程#1被線程#1搶占

線程#1執行factory()

線程#2搶占了線程#1

線程#2執行factory()

在這一點上,您有兩個線程帶有“ factory()”的兩個不同實例。

暫無
暫無

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

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