【发布时间】:2017-03-28 07:47:14
【问题描述】:
Java Concurrency in Practice一书提到
正确构造的对象可以通过以下方式安全发布:
Storing a reference to it into a final field of a properly constructed object
首先,我认为是因为 final 字段只能在类构造函数中初始化,而 Java 构造函数是隐式“Synchronized”。然而,我意识到事实并非如此。
class Student{
int student_id;
public Student(int i){
student_id = i;
}
}
class Test {
private final Student student;
public Test(){
student = new Student(1);
...
}
}
比如上面的代码,JVM如何保证student是一个安全的出版物?
静态决赛怎么样?
class Test {
private static final Student student;
public Test(){
student = new Student(1); //will this be partially constructed when the other thread reads a bad object ?
...
}
}
final 本身是否暗示了一些东西,以便 Jave Memory Model 将保证相同的发布?
【问题讨论】:
-
你最后的 sn-p 不会编译。
-
是的,我刚刚意识到静态最终文件必须在类加载时初始化,而不是在创建新实例时初始化。
标签: java multithreading thread-safety