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