Java-параллелизм: является ли конечное поле (инициализируется в конструкторе) потокобезопасным?

Кто-нибудь может сказать мне, является ли этот класс потокобезопасным?

class Foo {

    private final Map aMap;

    public Foo() {
        aMap = new HashMap();
        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 (); . Так другие потоки могут видеть эти

aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");

или нет?

Изменить: Я нашел этот вопрос , который точно закрывает мой вопрос

17
задан Community 23 May 2017 в 12:02
поделиться