class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could see 0
}
}
}
当在一个线程创建对象,然后在另一个线程使用这个对象时,就需要注意安全发布的问题。
如上例所示,一个线程执行writer方法,另一个线程执行reader方法,那么java语言规范保证final字段x一定是3,而非final字段y可能看到未初始化的状态0。
网友评论