我有一個Hashset<string>由多個執行緒訪問的。每當我讀或寫這個時,我都會鎖定它:
lock(lockObj)
{
myCollection.Add(myString);
}
一般來說,我在閱讀它時是否必須做同樣的事情?這樣做有什么好處嗎?
uj5u.com熱心網友回復:
不,您需要在 - 除了讀取之外 - 有寫入時鎖定它們。
只要集合沒有改變,就沒有可能導致不一致的改變。
我經常有非鎖定的多執行緒讀取,即包含應用程式在啟動時加載并且永遠不會改變的元資料的集合。
通常問題在于,對于性能(鎖很昂貴),鎖定是一種開銷,只要在寫入時沒有讀取發生(那些可能是不一致的) - 根本不需要開銷。
如果您必須寫入它,請使用 MultipleReaderSingleWriter 鎖。這僅允許一次寫入,但在不發生寫入的情況下允許無限的讀取器。RTFM 示例和方法詳細資訊。
uj5u.com熱心網友回復:
是的,您必須在多執行緒環境中lock寫入和讀取非執行緒安全集合。否則你可能會得到錯誤的值、撕裂的 值、隨機例外或其他任何東西。鎖定的好處是您的應用程式具有定義的行為(而不是未定義的),并且您將能夠推斷其正確性(而不是不知道那里發生了什么)。
例如,請參閱檔案對該Dictionary課程的評價:
A
Dictionary<TKey,TValue>可以支持多個讀者并發,只要不修改集合。即便如此,通過集合進行列舉本質上并不是一個執行緒安全的程序。在列舉與寫訪問爭用的罕見情況下,必須在整個列舉期間鎖定集合。要允許多個執行緒訪問集合進行讀寫,您必須實作自己的同步。
...或List<T>類:
對 a 執行多次讀取操作是安全的
List<T>,但如果在讀取時修改集合,則可能會出現問題。為確保執行緒安全,請在讀取或寫入操作期間鎖定集合。要使集合可以被多個執行緒訪問以進行讀寫,您必須實作自己的同步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350161.html
上一篇:筆記本中的條目-Tkinter
下一篇:使用執行緒的并行TCP連接
