是公共静态final int线程安全的



我想要一个文件,其中包含可从多个线程访问的常量。为此,有一个包含大量public static final int的类是安全的实现吗?

是的,它是线程安全的。任何static final变量都保证在类初始化后进行初始化。因此,一旦包含这样一个static final变量的类在代码中的任何地方使用,它总是根据JVMS的要求进行完全初始化(即设置值)。

对于基元int,这个条件更加严格。基元static final变量(String也是如此)是一个所谓的编译时间常数,由Java编译器javac内联。唯一的要求是该值可以由Java编译器计算,即它不能是非常量求值的结果。当您编写要定义常量时,我认为这不适用于您的用例。因此,这些常数值被直接复制到它们的访问位置,这减少了static final变量的非线程安全性通过反射被更改的情况,这在假设上是非基元类型的问题。

此外,使用这样的变量是一个好主意,因为它避免了使用所谓的幻数

是的,它是安全的。

该值永远不会改变,因此不存在比赛条件的风险。Java保证在任何东西尝试使用该值之前对其进行初始化

由于其他原因(设计的清晰度等),它是否是最好的架构是另一个问题。

是的,100%安全。它是最终的,所以没有人可以更改它。每个线程都必须作为只读线程访问,并且不存在只读争用。

对于基元,将它们设为final将使它们编译时间常数(如果直接初始化而不是方法的结果),并且int原语。因此,final int使其不可变,从而使线程安全

最新更新