gpt4 book ai didi

java - java static final 在多次初始化时会出错吗?

转载 作者:行者123 更新时间:2023-12-01 21:27:32 25 4
gpt4 key购买 nike

我有一个类,它存储几个静态最终字段,如下所示:

class MyExampleClass{
public static final DateFormat T_FORMAT = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH);;
public static final logger LOGGER = new OwnLogger();
...
}

此代码作为 jboss 内部的服务运行(多线程)。有人指出,上面的代码可能会抛出初始化错误,因为此类的所有实例都将引用相同的内存位置并尝试对其进行初始化。但是,由于变量是最终变量,因此他们将无法这样做并抛出异常。

我尝试四处搜索,但找不到任何解决此查询的引用资料。所以我有以下问题:

1) 静态字段是类级别变量,因此对于该类的所有实例来说都是相同的。但是当我们在构造函数中初始化它们时,这是否意味着每次创建新实例时 JVM 都会用新值覆盖以前的值?

2) 如果我们覆盖该字段(如上面所问),final 应该抛出错误,对吧?

3)假设我们没有覆盖:一旦一个类显式覆盖了静态字段内容,所有其他类都会看到相同的值。但这个新值(value)能持续多久?直到所有实例都被杀死并在延迟一段时间后我们实例化一个新的实例吗?还是永远?

我很困惑。将不胜感激任何帮助!

最佳答案

一个类仅以线程安全的方式初始化一次。

strong guarantees about this in the Java Language Specification .

The implementation of the Java Virtual Machine is responsible for taking care of synchronization and recursive initialization by using the following procedure.

因此,拥有 final static 字段就很好,不会出错。 以至于有时它被利用来提供线程安全的单例,通过 static holder pattern . 该字段将被初始化一次,每个人都会看到该字段的相同值*。出于实际目的,您可以假设该字段始终存在并且将永远存在。

另一方面,从实例方法(包括构造函数)向静态字段写入数据通常是一个很大的禁忌。

*有一些模糊的情况,这不是真的,但您不需要担心它们,除非您在静态初始化程序之间存在循环依赖关系,而无论如何您都不应该有这种依赖关系。

关于java - java static final 在多次初始化时会出错吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37856175/

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