Мне нужно лениво инициализировать карту и ее содержимое. У меня есть код ниже:
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
имеет значение null, продолжает инициализировать поле до new HashMap
, и пока он все еще загружает данные на карте, другой поток выполняет getValue
и не получает данные, если они могли существовать.
Как я могу убедиться, что данные загружаются на карту только один раз, когда происходит первый вызов getValue
.
Обратите внимание, что возможно, что key
не будет на карте после инициализации. Кроме того, возможно, что после инициализации карта просто пуста.