为了账号安全,请及时绑定邮箱和手机立即绑定

在.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 关注
  • 694 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信