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?

questionAnswers(2)

yourAnswerToTheQuestion