以线程安全的方式懒惰地初始化 Java 映射
我需要懒惰地初始化地图及其内容。到目前为止,我有以下代码:
class SomeClass {
private Map<String, String> someMap = null;
public String getValue(String key) {
if (someMap == null) {
synchronized(someMap) {
someMap = new HashMap<String, String>();
// initialize the map contents by loading some data from the database.
// possible for the map to be empty after this.
}
}
return someMap.get(key); // the key might not exist even after initialization
}
}
这显然不是线程安全的,因为如果一个线程在为空时出现,继续将字段初始化为并且当它仍在映射中加载数据时,另一个线程执行一个线程,并且在可能存在数据时不获取数据。someMap
new HashMap
getValue
如何确保在第一次调用发生时,数据仅在映射中加载一次。getValue
请注意,在所有初始化后,映射中可能不存在 。此外,在所有初始化后,映射可能只是空的。key