java - 如果我只从集合中读取,是否需要担心线程安全?

标签 java concurrency

我想将预构建的 Map 传递给多个线程,这些线程只会同时从 Map 读取值。在这种情况下,我是否需要担心并发访问并使用 ConcurrentHashMap 而不是 HashMap?

最佳答案

您仍然需要确保在创建和初始化 Map 的线程与随后读取它的线程之间存在“先于发生”的关系。如果没有这种关系,理论上读取线程可以看到陈旧数据。

如果您在启动其他线程的线程中创建并填充 Map ... 在它执行此操作之前 ... 您应该没问题。

另一种确保安全的简单方法是执行以下操作:

public class Foo {
    private final Map map;

    public Foo(....) {
        map = new HashMap();
        // populate
    }

    public Map getMap() {
        // If the 'map' is final, and nothing changes it apart from 
        // the constructor, this method doesn't need to be synchronized.
    }

这两者都会导致创建/初始化与每个线程首次使用 Map 之间的“先发生”关系。

您也可以将上面的 map 声明为 volatile,但可能会导致比严格需要发生的缓存刷新次数更多;也就是说,您的性能会受到很小的影响。

关于java - 如果我只从集合中读取,是否需要担心线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11292683/

相关文章:

java - Spark Dataset<Row> vector 列到数组类型转换

java - split( "\r\n")没有在java中分割我的字符串

java - 通过网络发送带有换行符的文本

java - Scala/Java 项目在 Maven 编译期间找不到依赖项

java - 部分线程安全是否使 Java 类线程安全?

java - 单独列表上的 ConcurrentModificationException 不清楚

java - Android中使用if语句比较字符串

c++ - 使用 lambda 作为试运行选项正常吗?

java - 增量操作的原子性

c# - .NET 4.0 System.Collections.Concurrent 集合在 .NET 3.0 SynchronizedCollection 的功能中添加了什么?