JSR-133によれば、不変のオブジェクトはスレッドセーフであり、同期を必要としません。しかし、それはリフレクションを使用して、最終的なフィールドの値を更新することが可能です:私は仕様が何をするか興味が反射に頼っているフレームワークの反射と不変性がどのように協調するのでしょうか
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());
}
}
与えられた数(春とHibernateがほんの一部ですが)、このシナリオについて述べています。例えば。フィールド更新を同期ブロックにすると、他のスレッドでの可視性が保証されます。または、finalの仕様に従ってレジスタにキャッシュされます。
http://download.oracle.com/otndocs/jcp/memory_model-1.0-pfd-spec-oth-JSpec/