亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在.NET Framework中并發HashSet <T>?

在.NET Framework中并發HashSet <T>?

C#
慕村9548890 2019-10-18 10:33:11
我有以下課程。class Test{    public HashSet<string> Data = new HashSet<string>();}我需要從不同的線程更改字段“數據”,所以我想對當前的線程安全實現提出一些意見。class Test{    public HashSet<string> Data = new HashSet<string>();    public void Add(string Val){            lock(Data) Data.Add(Val);    }    public void Remove(string Val){            lock(Data) Data.Remove(Val);    }}有沒有更好的解決方案,可以直接進入現場并保護它免受多個線程的并發訪問?
查看完整描述

3 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

既然沒有其他人提到過,我將提供一種可能適合或不適合您特定目的的替代方法:


Microsoft不可變集合

來自MS團隊背后的博客文章:


盡管并發創建和運行比以往任何時候都容易,但基本問題之一仍然存在:可變的共享狀態。從多個線程讀取通常非常容易,但是一旦需要更新狀態,狀態就會變得困難得多,尤其是在需要鎖定的設計中。


鎖定的替代方法是使用不可變狀態。不變的數據結構保證永遠不會改變,因此可以在不同線程之間自由傳遞,而不必擔心踩到別人的腳趾。


但是,這種設計帶來了一個新問題:如何在不每次都復制整個狀態的情況下管理狀態更改?當涉及集合時,這尤其棘手。


這是不可變集合的來源。


這些集合包括ImmutableHashSet <T>和ImmutableList <T>。


性能

由于不可變集合使用下面的樹數據結構來實現結構共享,因此它們的性能特征不同于可變集合。與鎖定可變集合進行比較時,結果將取決于鎖定爭用和訪問模式。但是,取自關于不可變集合的另一篇博客文章:


問:我聽說不可變的收藏很慢。這些有什么不同嗎?當性能或內存很重要時,可以使用它們嗎?


答:這些不可變的集合已經過高度調整,在平衡內存共享的同時具有可變集合的競爭性能。在某些情況下,它們在算法上和實際時間上幾乎與可變集合一樣快,有時甚至更快,而在其他情況下,它們在算法上更復雜。但是,在許多情況下,差異可以忽略不計。通常,您應該使用最簡單的代碼來完成工作,然后根據需要調整性能。不可變的集合可幫助您編寫簡單的代碼,尤其是在必須考慮線程安全性的情況下。


換句話說,在許多情況下,差異不會很明顯,您應該選擇更簡單的選擇-對于并發集,將使用ImmutableHashSet<T>,因為您沒有現有的鎖定可變實現!:-)


查看完整回答
反對 回復 2019-10-18
  • 3 回答
  • 0 關注
  • 748 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號