Java hashmap 只读线程安全

标签 java hashmap thread-safety

我的这段代码有一个在静态 block 中初始化的共享 HashMap 。我不公开散列图,它以只读方式使用(get 和 containKey)。 我想确定这是否是线程安全的。

public class MyClass {
    private static final Map<String, MyObject> myMap;

    static {
        myMap = new MyLoader().load()
    }

    public MyClass() {
        if (containsKey(someKey)) {
           // do something
        }
        myMap.get(something)
    }

    static boolean containsKey(String key) {
        // do some other stuff
        return myMap.containsKey(key)
    }
}

最佳答案

假设 new MyLoader().load() 返回一个用所有数据完全初始化并且之后从未修改过的映射,那么所有线程从中检索数据都是安全的同时映射。 HashMap 的 Javadoc 说:“如果多个线程同时访问 HashMap ,并且至少有一个线程在结构上修改了映射,则它必须在外部同步。”因此,如果没有线程正在修改映射,则不必同步它。

作为一项安全措施,您的 load() 方法应强制执行不变性:

public Map<String, MyObject> load() {
    Map<String, MyObject> mymap = new HashMap<>();
    mymap.put(...);
    ...
    return Collections.unmodifiableMap(mymap);
}

这样,您就不必担心您不熟悉的某些代码中的某些线程可能会无意中修改 map 。它将无法。

关于Java hashmap 只读线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42380668/

相关文章:

java - Eratosthenes 筛法不会筛选素数

java - Map 中存储的每个对象都会返回最后一个对象中存储的值

Java Map vs Array(Temp)排序的最后一个索引

java - 如果不再引用该对象,那么 "thread of the object"扩展线程会发生什么情况?

java - 使用户制作的矩形出现在屏幕上

java Gui从其他类访问arrayList

java - 需要编译 Java 的帮助(访问器、修改器、构造器)

java - 处理映射、equals() 和 hashCodes()。这有多有效?

java - 如何使用PrintWriter和flush()在文本文件上打印内容?

java - 在 runOnUiThread 线程中修改我的 ArrayList 是否安全?