gpt4 book ai didi

java - 为什么这个 static final 变量在单例中是线程安全的?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:03 25 4
gpt4 key购买 nike

阅读这个网站,我找到了 this :

[The] line private static final Foo INSTANCE = new Foo(); is only executed when the class is actually used, this takes care of the lazy instantiation, and is it guaranteed to be thread safe.

为什么保证线程安全?因为这个字段是final?还是出于其他原因?

最佳答案

因为它是最终的,是的。 Final 变量具有特殊的线程安全语义,因为保证其他线程看到 final 字段时至少处于其构造函数完成时所处的状态。

这是在JLS 17.5 ,虽然那里的语言有点密集。这些语义是在 Java 1.5 中引入的,特别是 JSR-133 .有关 JSR-133 及其各种影响的非规范讨论,请参阅此页面。

请注意,如果您在其构造函数之后修改实例,那不一定是线程安全的。在这种情况下,您必须采取通常的线程安全预防措施来确保边缘发生前。

我相当确定(尽管不是 100%)只有一个线程执行类初始化这一事实不是这里的一个因素。确实该类仅由一个线程初始化,但我不相信在该线程与任何其他使用该类的线程之间建立任何特定的发生之前的边缘(除了不必重新初始化的其他线程)类)。因此,如果没有 final 关键字,另一个线程将能够看到该对象的部分构造实例。 JMM 定义的特定发生前边在 JLS 17.4.5 中,并且类初始化未在此处列出。

关于java - 为什么这个 static final 变量在单例中是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8865086/

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