gpt4 book ai didi

java - static 是否在 JMM 上下文中提供额外的保证?

转载 作者:行者123 更新时间:2023-12-01 20:15:05 25 4
gpt4 key购买 nike

我正在阅读有关 java singleton 的内容,并且遇到了一些奇怪的事情。

我会引用following artice例如(您可以轻松找到更多)

作者提供了以下单例:

public class ASingleton {

private static ASingleton instance = new ASingleton();

private ASingleton() {
}

public static ASingleton getInstance() {
return instance;
}

}

和评论:

Pros:
-Thread safety without synchronization
- Easy to implement

Cons:
- Early creation of resource that might not be used in the application.
-The client application can’t pass any argument, so we can’t reuse it.
For example, having a generic singleton class for database connection
where client application supplies database server properties.

我想得到关于没有同步的线程安全点的澄清。

我在练习书中读过并发,但不记得与此相关的任何内容。

我遗漏了一些内容或者此说明不相关?

此外,我想告诉您,您可能会遇到相同的单例,但字段标记为 static Final 而不仅仅是 static
附注

我知道我可以阅读 JMM这个包含了答案,但我是个普通人,我无法理解这个来源。

最佳答案

根据securecoding.cert.org这是一个有效的模式:

Variables that are declared static and initialized at declaration or from a static initializer are guaranteed to be fully constructed before being made visible to other threads. However, this solution forgoes the benefits of lazy initialization.

要点是:加载类是一个定义明确的操作。执行静态初始化代码属于同一类别。

重要的是要理解:只有当您使用静态字段 + 惰性初始化变体时,JMM知识才是“必需的”:

Initialization of the static helper field is deferred until the getInstance() method is called. The necessary happens-before relationships are created by the combination of the class loader's actions loading and initializing the Holder instance and the guarantees provided by the Java memory model (JMM). This idiom is a better choice than the double-checked locking idiom for lazily initializing static fields [Bloch 2008]. However, this idiom cannot be used to lazily initialize instance fields [Bloch 2001].

Finally:final 关键字应该对此产生任何影响。使用final更多的是表达您声明一个好的、最终事物的意图 - 而不是稍后可能更新的事物。

关于java - static 是否在 JMM 上下文中提供额外的保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45959212/

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