Параллелизм Java - публикация неизменяемых объектов (параллелизм Java на практике)

В Java параллелизма на практике автор заявил, что

Неизменяемые объекты могут быть опубликованы с помощью любого механизмаНеизменяемые объекты могут безопасно использоваться любым потоком без дополнительной синхронизации, даже если синхронизация не используется для их публикации.

Означает ли это, что следующие идиомы безопасны для публикации неизменяемых объектов?

public static List<ImmutableObject> list = new ArrayList<ImmutableObject>();

// thread A invokes this method first
public static void methodA () {
    list.add(new ImmutableObject());
}

// thread B invokes this method later
public static ImmutableObject methodB () {
    return list.get(0);
}

Будет ли гонка данных? (что означает, что поток B может не видеть неизменный объект в списке, добавленном потоком A)

Большое спасибо.

Более того, автор сказал, что следующий код безопасен, если Resource неизменен.

@NotThreadSafe
public class UnsafeLazyInitialization {
    private static Resource resource;

    public static Resource getInstance() {
        if (resource == null)
            resource = new Resource();  // unsafe publication
        return resource;
    }
}

Section16.3 Гарантия безопасности инициализации позволяет безопасно создавать правильно созданные неизменяемые объекты между потоками без синхронизации, независимо от того, как они публикуются, даже если они публикуются с использованием гонки данных. (Это значит, чтоunsafeLazyInitialization на самом деле безопасно, еслиResource неизменен.)

Что касается второй части этого вопроса, она подробно обсуждается в другом вопросе (щелкнитеВот)

Ответы на вопрос(4)

Ваш ответ на вопрос