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

Sam*_*eff 12 .net c# multithreading thread-safety

如果我初始化一个初始化器HashSet<>内部Lazy然后从不更改内容,那HashSet<>本身就是线程安全的吗?是否有读取需要锁定的操作?

类似的Java问题,这里的收藏品一般,基本上说是,但也有一些注意事项(即不要在此情况下适用).

Pat*_*man 13

是的.只要HashSet对象的构造是线程安全的,只要内容不改变,访问它将始终是线程安全的.

如果初始化Lazy使用LazyThreadSafetyMode.PublicationOnly,你可以肯定的初始化Lazy是线程安全的.

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

一个小代码示例:

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

  • 尽管我相信实际上是对的,但我无法保证未修改的HashSet操作是线程安全的。实际上,HashSet文档另有说明:https://msdn.microsoft.com/zh-cn/library/bb359438(v=vs.110).aspx“不保证任何实例成员都是线程安全的。” 您是否有证据证明在这种情况下可以保证线程安全? (2认同)