Encontré la siguiente clase en el libro "Concurrencia de Java en la práctica". El autor afirma que el estado del Titular puede ser obsoleto en el siguiente ejemplo, lo que resulta en AssertionError cuando se llama a assertSanity. ¿Cómo se puede hacer inmutable la siguiente clase de titular para superar esto?
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"); } } //unsafe publication public Holder holder; public void initialize(){ holder = new Holder(42); }Para hacer que la clase Holder sea inmutable, simplemente cambie
private int n;para
private final int n; También puede agregar un método getter público (no synchronized ) para el campo Holder.n , si lo desea. No tiene mucho sentido tener un campo privado que nada pueda usar.
(Pero deshágase de la afirmación de assertSanity porque no tiene ningún uso terrenal).
Cuando haya hecho lo anterior, Holder será inmutable con respecto al campo n , y no tendrá que preocuparse por la publicación insegura de ese campo.