簡體   English   中英

在寫入時鎖定 .NET 字典是否是線程安全的,並且讀取它是無鎖的?

[英]Is it thread-safe to lock a .NET Dictionary on write, and read it lock-free?

我知道字典不是線程安全的。

但是為了簡單起見,我有時(當場景不太復雜時)將它們包裹在一個鎖周圍並在多線程環境中使用它,即使可以使用其他並發結構(例如: ConcurrentDictionary )。

這是我正在做的一個例子:

 public class Example 
 {
     private object _sync = new object();
     private Dictionary<string,stirng> _dictionary = new Dictionary<string,string> ();

     public void Write (string key, stirng value)
     {
          lock(_sync)
          {
                if (_dictionary.ContainsKey(key) == false)
                     _dictionary.Add(key,value);
          }
     }

     public string Read (string key)
     {
          if (_dictionary.ContainsKey(key))
              return _dictionary[key];

          return null;
     }
}

恐怕連邊寫邊看字典,都可能產生不一致的數據。
我不害怕閱讀舊數據,也不害怕“看到”新數據(直到寫入結束),這在我的場景中是可以的。
即使新數據是唯一不一致的數據(直到寫操作結束)也沒關系。
我擔心的是字典結構在插入時可能位於可用的 state 中(因此,即使對於非常舊的密鑰而不僅僅是新密鑰,在那一刻的讀取也會產生完全混亂的結果)。

不,它不是線程安全的。 Dictionary<TKey,TValue>對多個閱讀器來說是線程安全的,前提是它位於永久不可變(“凍結”)state 中。 如果要同時從多個線程讀取寫入字典,則必須始終lock所有操作(讀取寫入),否則程序的行為是未定義的。

鎖定速度很快:在 2010 年代的計算機上,如果鎖沒有爭用,您可以期望在短短 20 納秒內獲取和釋放鎖。 因此,當應用的正確性受到威脅時,您不必過於擔心應用的性能。¹

¹鎖定速度很快,但並非沒有成本。 如果您的應用預計每秒對同一個字典執行數百萬次讀取和寫入操作,那么切換到ConcurrentDictionary<K,V>很可能對您的應用性能有很大的好處。

暫無
暫無

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

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