我的代码在静态块中具有初始化的共享哈希地图。我不揭示哈希图,并且仅使用读取(get and contakekey)。我想确保这是否是线程安全。
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说:"如果多个线程同时访问哈希地图,并且至少一个线程会在结构上修改地图,则必须在外部同步。"因此,如果没有线程修改地图,则不必同步。
作为安全措施,您的load()
方法应强制执行不变性:
public Map<String, MyObject> load() {
Map<String, MyObject> mymap = new HashMap<>();
mymap.put(...);
...
return Collections.unmodifiableMap(mymap);
}
这样,您不必担心您不熟悉的某些代码中的某些线程可能会无意间修改地图。它将无法。