反射和不可变性应该如何协同工作
2022-09-04 03:11:30
根据 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());
}
}
给定许多依赖于反射的框架(Spring和Hibernate只是少数),我很好奇规范对这种情况有什么看法。例如,如果我将字段更新放入同步块中,这将保证在其他线程中的可见性,或者值将按照最终的规范缓存在寄存器中。
http://download.oracle.com/otndocs/jcp/memory_model-1.0-pfd-spec-oth-JSpec/