只读哈希集本质上是线程安全的

本文关键字:安全 线程 哈希集 本质上 只读 | 更新日期: 2023-09-27 18:31:50

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

对于集合,这里通常有类似的 Java 问题,它基本上说是的,但有一些警告(不适用于这种情况)。

只读哈希集本质上是线程安全的

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

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

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

一个小代码示例:

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