Does this mean that if I have a final
field in class A of type Class B,
which in turn have a final field of
type Integer,then final field freeze
for an instance of class A completes
only after the final field freeze for
b.c have already happened?
我想我会仔细地说,在这种情况下,最终的字段冻结意味着当你创建一个A的实例并安全地发布它,其他对象永远不会看到b或c的未初始化的值.
我也会说,当你在A中创建B的实例时,A中的其他初始化代码将永远不会看到c的未初始化值.
一个遇到真正问题的例子是例如一个包含一个(可变的)HashMap的类,只用于在构建过程中初始化:
public class DaysOfWeek {
private final Map daysOfWeek = new HashMap();
public DaysOfWeek() {
// prepopulate my map
daysOfWeek.put(0,"Sunday");
daysOfWeek.put(1,"Monday");
// etc
}
public String getDayName(int dayOfWeek) {
return daysOfWeek(dayOfWeek);
}
}
问题出在这里:假设这个对象被安全地发布,并且由于这里没有同步,其他线程调用getDayName()是否安全?答案是肯定的,因为最终的域冻结保证HashMap和一切都可以从它(这里只是字符串,但可以是任意复杂的对象)可以到达结构冻结. [如果你想在构建之后实际修改这个地图,那么你需要在读写上进行明确的同步.]这是一个lengthier blog探索这个主题,并检查一些有趣的回应的意见,像Brian Goetz这样的人.
btw我是refcard的作者