我的这段代码有一个在静态 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/