只读HashSet本身是线程安全的吗?

时间:2014-11-25 15:56:23

标签: c# .net multithreading thread-safety

如果我在HashSet<>初始值设定项中初始化Lazy然后从不更改内容,那么HashSet<>本身是线程安全的吗?是否有读取需要锁定的操作?

类似的Java问题here通常用于收集,基本上是肯定的,但有一些警告(在这种情况下不适用)。

1 个答案:

答案 0 :(得分:12)

是的,确实如此。只要HashSet对象的构造是线程安全的,只要内容没有改变,访问它将始终是线程安全的。

如果initialize使用LazyThreadSafetyMode.PublicationOnly Lazy,您可以确定Lazy的初始化是线程安全的。

  

当多个线程尝试同时初始化Lazy<T>实例时,允许所有线程运行初始化方法(或者如果没有初始化方法,则运行默认构造函数)。完成初始化的第一个线程设置Lazy<T>实例的值。除非初始化方法在这些线程上抛出异常,否则该值将返回到同时运行初始化方法的任何其他线程。

一个小代码示例:

var l = new Lazy<HashSet<string>>( () => new HashSet<string>() { "a" }
                                 , LazyThreadSafetyMode.PublicationOnly
                                 );