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)