Java Concurrency in Practice 一书提到了
可以通过以下方式安全地发布正确构造的对象:
Storing a reference to it into a final field of a properly constructed object
首先,我认为因为 final 字段只能在类构造函数中启动,而Java构造函数是隐含的" 同步"。但是,我意识到情况并非如此。
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如何保证学生是一个安全的出版物?
静态最终怎么样?
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会保证同一个出版物?
答案 0 :(得分:1)
JVM保证学生是安全的出版物吗?
有许多方法可以确保安全发布,通常使用写屏障就足够了。但无论如何,JVM必须为它运行的处理器保证这一点。
这是静态决赛呢?
所有静态字段都以单线程方式初始化。无论您是否使用final,类初始化都是线程安全的。
最终本身是否意味着Jave Memory Model将保证同一出版物?
除了构造函数,不是真的。支持安全发布不应改变的价值更容易。