gpt4 book ai didi

java - 为什么在构造函数不同步的情况下final关键字可以保证安全发布?

转载 作者:行者123 更新时间:2023-11-30 10:36:25 25 4
gpt4 key购买 nike

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如何保证student是一个安全的发布?

static final 怎么样?

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 内存模型将保证相同的发布?

最佳答案

JVM guarantee student is a safe publication?

有很多方法可以确保安全发布,通常使用写屏障就足够了。在任何情况下,JVM 都必须为其运行的处理器保证这一点。

What about it is a static final?

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

Does final itself imply something so that Jave Memory Model will guarantee the same publication ?

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

关于java - 为什么在构造函数不同步的情况下final关键字可以保证安全发布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40592711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com