【发布时间】:2014-11-25 15:56:22
【问题描述】:
如果我在Lazy 初始化程序中初始化HashSet<>,然后从不更改内容,那么HashSet<> 本身是线程安全的吗?是否存在需要锁定的读取操作?
关于集合的类似 Java 问题 here,基本上说是,但有一些警告(不适用于这种情况)。
【问题讨论】:
-
是的,如果它真的没有改变并且在构造时没有被访问,那么是的,你会没事的。也就是说,没有什么可以阻止某人更改它,因此它的“只读”行为是非强制的。试试不可变集合。
-
@AdamHouldsworth 不幸的是,不可变集合具有可怕的性能ayende.com/blog/164739/immutable-collections-performance
-
@ChrisMarisic 性能不佳是众所周知的。也就是说,对于许多场景,性能问题不会浮出水面。您始终可以通过在内部包装非不可变集合来实现自己的集合,这些年来对它们进行了许多优化。
-
@AdamHouldsworth 如何将缓慢的包裹起来让它变得更快?更不用说保持不变性了?在 C# 中保持不变是荒谬的。然而,他们在 Ayende 的 cmets 中讨论的代码提供了有趣的构造,让您自己动手。
-
@ChrisMarisic 我的意思是包装一个数组或字典之类的东西以便滚动你自己的,具有一个一旦构建就不允许更改的 API。我不是指包装现有的不可变类型。
标签: c# .net multithreading thread-safety