【发布时间】:2015-12-17 18:11:51
【问题描述】:
我知道,在构造函数完成后,最终实例变量会安全地发布到所有线程。但是,我想知道如果最终实例变量包含对包含非最终实例变量的对象的引用,这是否仍然安全。在构造函数完成后,这个辅助的、非最终的实例变量永远不会改变。考虑以下示例:
public class NonFinalImmutable {
private Iterable<String> list = Collections.unmodifiableList(Arrays
.asList("foo", "bar", "foobar"));
public Iterable<String> getList() {
return list;
}
}
public class FinalImmutable {
private final NonFinalImmutable reference;
private final String[] array;
public FinalImmutable(NonFinalImmutable reference,
String... arrayEntries) {
this.reference = reference;
this.array = arrayEntries;
}
public NonFinalImmutable getReference() {
return reference;
}
public String[] getArray() {
return array;
}
}
private void execute() {
new Thread() {
@Override
public void run() {
useLater(construct());
}
}.start();
}
private FinalImmutable construct() {
return new FinalImmutable(new NonFinalImmutable(), "asdf", "jklö");
}
private void useLater(FinalImmutable finalImmutable) {
new Thread() {
@Override
public void run() {
for (String s : finalImmutable.getReference().getList()) {
System.out.println(s);
}
System.out.println();
for (String s : finalImmutable.getArray()) {
System.out.println(s);
}
}
}.start();
}
在另一个线程中使用实例变量FinalImmutable.reference 和FinalImmutable.array 的内容是否安全,即使它们包含非最终实例变量?
【问题讨论】:
标签: java multithreading thread-safety final java-memory-model