Zgodnie z JSR-133 niezmienne obiekty są bezpieczne dla wątków i nie wymagają synchronizacji. Jednak jest to możliwe do aktualizacji wartości pól końcowych przy użyciu odbicia:Jak działa odbicie i niezmienność?
package com.stackoverflow;
import java.lang.reflect.Field;
public class WhatsGoingOn {
static class Immutable {
private final int value;
public Immutable(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
final Immutable immutable = new Immutable(Integer.MIN_VALUE);
final Field f = Immutable.class.getDeclaredField("value");
f.setAccessible(true);
System.out.println(immutable.getValue());
f.set(immutable, Integer.MAX_VALUE);
System.out.println(immutable.getValue());
}
}
Biorąc pod uwagę ilość ram (wiosna i hibernacji to tylko kilka), które opierają się na refleksji Jestem ciekaw, co robi specyfikacja mówi o tym scenariuszu. Na przykład. jeśli wstawię aktualizację pola do zsynchronizowanego bloku, to zagwarantuje to widoczność w innych wątkach, lub wartość zostanie zapisana w pamięci podręcznej, zgodnie ze specyfikacją końcową.
http://download.oracle.com/otndocs/jcp/memory_model-1.0-pfd-spec-oth-JSpec/