Может ли кто-нибудь сказать, является ли этот класс потокобезопасным или нет?
class Foo {
private final Map<String,String> aMap;
public Foo() {
aMap = new HashMap<String, String>();
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
}
public String get(String key) {
return aMap.get(key);
}
}
Изменить: Это моя ошибка, чтобы не уточнить вопрос. Согласно JMM FAQ:
Необходимо предоставить новую гарантию безопасности инициализации. Если объект правильно сконструирован (что означает, что ссылки на него не исчезают во время построения), то все потоки, которые видят ссылку на этот объект, также будут видеть значения для своих окончательных полей, которые были установлены в конструкторе, без необходимости синхронизации.
Это заставило меня смутить, что набор в aMap равен aMap = new HashMap<String, String>();
. Таким образом, другие потоки могут видеть эти
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
или нет?
Изменить: я нашел этот question, который точно закрыт для моего вопроса