[英]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.