Java Concurrency - Publicando Objetos Imutáveis ​​(Java Concurrency In Practice)

Em Java Concurrency In Practice, o autor afirmou que

Objetos imutáveis ​​podem ser publicados através de qualquer mecanismoObjetos imutáveis ​​podem ser usados ​​com segurança por qualquer thread sem sincronização adicional, mesmo quando a sincronização não é usada para publicá-los.

Significa que os seguintes idiomas são seguros para publicar objetos imutáveis?

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);
}

Haveria alguma corrida de dados? (o que significa que o encadeamento B pode não conseguir ver o Objeto Imutável na lista adicionada pelo encadeamento A)

Muito obrigado.

Mais, o autor disse que o seguinte código é seguro se o recurso é imutável.

@NotThreadSafe
public class UnsafeLazyInitialization {
    private static Resource resource;

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

Seção16.3 A garantia de segurança de inicialização permite que objetos imutáveis ​​adequadamente construídos sejam compartilhados com segurança através de threads sem sincronização, independentemente de como eles são publicados, mesmo se publicados usando uma corrida de dados. (Isso significa queunsafeLazyInitialization é realmente seguro seResource é imutável.)

Para a 2ª parte desta questão, é discutido em detalhes em outra questão (cliqueAqui)

questionAnswers(4)

yourAnswerToTheQuestion