【发布时间】:2018-02-07 07:53:22
【问题描述】:
假设你有这个代码sn-p
private final Set set = new HashSet() {{ add(1); }};
SomeConstructor() {
printSet();
}
long printSet() {
new Thread(() -> {System.out.println(set)}).start();
}
例如,如果编译器决定让它看起来像
private final Set set;
SomeConstructor() {
printSet();
set = new HashSet() {{ add(1); }};
}
这将是一个问题,因为 calculateWaitTime() 会创建一个新线程,该线程可能会将集合视为 null 或其中没有 1。
那么问题又来了,这种重新排序可能吗?或者在构造函数之外初始化的所有最终字段是否在构造函数之前初始化,或者至少总是由编译器移动到构造函数的顶部
【问题讨论】:
-
在运行构造函数之前,它们所属的实例不存在。另外:从构造函数调用非最终(可能通过继承更改)方法并不是最明智的做法。
标签: java multithreading thread-safety visibility safe-publication