如果构造函数不同步,为什么最终关键字可以保证安全发布?

时间:2016-11-14 15:49:52

标签: java multithreading thread-safety

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会保证同一个出版物?

1 个答案:

答案 0 :(得分:1)

  

JVM保证学生是安全的出版物吗?

有许多方法可以确保安全发布,通常使用写屏障就足够了。但无论如何,JVM必须为它运行的处理器保证这一点。

  

这是静态决赛呢?

所有静态字段都以单线程方式初始化。无论您是否使用final,类初始化都是线程安全的。

  

最终本身是否意味着Jave Memory Model将保证同一出版物?

除了构造函数,不是真的。支持安全发布不应改变的价值更容易。