如果我有一個ConcurrentDictionary物件,在外部執行操作時ConcurrentDictionary<int, Dictionary<string, string>>() dict;嵌套是否鎖定?DictionaryConcurrentDictionary
場景:外部ConcurrentDictionary outerDict正在執行
outerDict.Add(42, new Dictionary<string, string>())
在一個執行緒上,并且,在另一個執行緒上(同時),內部Dictionary正在執行
outerDict[30].Add("hello", "world").
ConcurrentDictionary上述場景中外層和嵌套的修改是并發應用的Dictionary,還是同時進行這兩個操作?
uj5u.com熱心網友回復:
當然不是,它們是具有不同訪問規則的不同字典。
但是,您的示例很好,因為您正在從不同的執行緒訪問不同的字典。如果您要這樣做:
outerDict[30]["a"] = "b"; // in thread 1
outerDict[30]["g"] = "h"; // in thread 2
你很快就會遇到問題。
uj5u.com熱心網友回復:
這里有4個操作:
- 創建一個新物件。這樣做不會影響并發,因為當時沒有其他人參考該物件。
- 將物件添加到并發字典。沒問題,因為它是一個并發字典。
- 訪問并發字典中的第 30 個條目。沒問題,因為它是一個并發字典
- 向第 30 個字典添加一個新值:有問題,如果另一個執行緒也參考了第 30 個字典。
uj5u.com熱心網友回復:
AConcurrentDictionary<TKey, TValue>是執行緒安全的。它的設計使多個執行緒可以安全地使用該字典中的鍵。它不能也不會將該執行緒安全擴展到存盤在字典中的值。
并發字典存盤對內部字典的參考。但是內部字典并不“知道”任何參考它的東西。據它所知,它只是一個Dictionary<string, string>.
盡管并發字典參考了內部字典,但它不以任何方式“擁有”或控制該內部字典。
您可以撰寫以下代碼:
var innerDictionary = new Dictionary<string, string>();
outerDict.Add(42, innerDictionary);
在這種情況下innerDictionary,仍然保持對該字典的參考。它可以將其作為引數傳遞給另一個方法。并發字典可能超出范圍并被垃圾收集,而其他一些物件維護對內部字典的參考。
關鍵是,除了持有對物件的參考的并發字典之外,它不控制該物件的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441381.html
上一篇:將字典值解包到函式引數中
下一篇:從字典值中獲取子字串
