Os objetos imutáveis são imunes a publicação inadequada?
É um exemplo deJCiP.
public class Unsafe {
// Unsafe publication
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
}
public class Holder {
private int n;
public Holder(int n) {
this.n = n;
}
public void assertSanity() {
if (n != n) {
throw new AssertionError("This statement is false.");
}
}
}
Na página 34:
[15] O problema aqui não é a própria classe Holder, mas o fato de o Holder não ser publicado corretamente. No entanto, o Holder pode ficar imune a publicação imprópria declarando o campo n como final, o que tornaria o Holder imutável;
E deesta resposta:
a especificação para final (consulte a resposta de @ andersoj) garante que, quando o construtor retornar, o campo final será inicializado corretamente (como visível em todos os threads).
Dewiki:
Por exemplo, em Java, se uma chamada para um construtor tiver sido incorporada, a variável compartilhada poderá ser atualizada imediatamente depois que o armazenamento for alocado, mas antes que o construtor incorporado inicialize o objeto
Minha pergunta é:
Porque: (pode estar errado, eu não sei.)
a) a variável compartilhada pode ser atualizada imediatamente antes que o construtor incorporado inicialize o objeto.
b) será garantido que o campo final seja inicializado corretamente (como visível em todos os threads) SOMENTE quando o construtor retornar.
É possível que outro encadeamento veja o valor padrão deholder.n
? (ou seja, outro segmento obtém uma referência aholder
antes de oholder
retornos do construtor.)
Se sim, então como você explica a afirmação abaixo?
O Holder pode ficar imune a publicação imprópria declarando o campo n como final, o que tornaria o Holder imutável
EDITAR: Do JCiP. A definição de um objeto imutável:
Um objeto é imutável se:
x Seu estado não pode ser modificado após a construção;
x Todos os seus campos são finais; [12] e
x Está adequadamente construído (a referência não escapa durante a construção).
Então, por definição, objetos imutáveis não têm "this
referência escapando "problemas. Certo?
Mas eles sofrerão comGravações fora de ordem no padrão de bloqueio com verificação dupla se não for declarado volátil?