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

我有以下课程。


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);

    }

}

有没有更好的解决方案,可以直接进入现场并保护它免受多个线程的并发访问?


慕村9548890
浏览 697回答 3
3回答

沧海一幻觉

既然没有其他人提到过,我将提供一种可能适合或不适合您特定目的的替代方法:Microsoft不可变集合来自MS团队背后的博客文章:尽管并发创建和运行比以往任何时候都容易,但基本问题之一仍然存在:可变的共享状态。从多个线程读取通常非常容易,但是一旦需要更新状态,状态就会变得困难得多,尤其是在需要锁定的设计中。锁定的替代方法是使用不可变状态。不变的数据结构保证永远不会改变,因此可以在不同线程之间自由传递,而不必担心踩到别人的脚趾。但是,这种设计带来了一个新问题:如何在不每次都复制整个状态的情况下管理状态更改?当涉及集合时,这尤其棘手。这是不可变集合的来源。这些集合包括ImmutableHashSet <T>和ImmutableList <T>。性能由于不可变集合使用下面的树数据结构来实现结构共享,因此它们的性能特征不同于可变集合。与锁定可变集合进行比较时,结果将取决于锁定争用和访问模式。但是,取自关于不可变集合的另一篇博客文章:问:我听说不可变的收藏很慢。这些有什么不同吗?当性能或内存很重要时,可以使用它们吗?答:这些不可变的集合已经过高度调整,在平衡内存共享的同时具有可变集合的竞争性能。在某些情况下,它们在算法上和实际时间上几乎与可变集合一样快,有时甚至更快,而在其他情况下,它们在算法上更复杂。但是,在许多情况下,差异可以忽略不计。通常,您应该使用最简单的代码来完成工作,然后根据需要调整性能。不可变的集合可帮助您编写简单的代码,尤其是在必须考虑线程安全性的情况下。换句话说,在许多情况下,差异不会很明显,您应该选择更简单的选择-对于并发集,将使用ImmutableHashSet<T>,因为您没有现有的锁定可变实现!:-)
打开App,查看更多内容
随时随地看视频慕课网APP