我想要一个从多个线程访问常量的文件。为此创建一个具有大量public static final int
s的类是安全的实现吗?
答案 0 :(得分:8)
是的,它是线程安全的。保证在类初始化之后初始化任何static final
变量。因此,一旦在代码中的任何位置使用包含此类static final
变量的类,它始终会被requirement of the JVMS完全初始化(即设置值)。
使用原始int
,这种情况更加严峻。原始static final
变量(同样适用于String
)是所谓的compile-time constant,由Java编译器 javac 内联。唯一的要求是该值可以由Java编译器计算,即它不能是非常量评估的结果。在你写这篇文章时你想要定义常量,我认为这不适用于你的用例。因此,这些常量值被直接复制到它们的访问位置,从而减少了通过反射改变的static final
变量的非线程安全性的角落 - 假设是非原始类型的问题。
此外,使用这些变量是一个好主意,因为它避免使用所谓的magic numbers。
答案 1 :(得分:3)
是的,这是安全的。
价值永远不会改变,因此不存在竞争条件的风险。 Java保证在尝试使用它之前初始化该值。
出于其他原因(设计的清晰度等)是否是最好的架构是另一个问题。
答案 2 :(得分:3)
是的,100%安全。这是最终的,所以没人能改变它。每个线程只能作为读者访问,并且不存在只读的争用。
答案 3 :(得分:1)
对于原语,使它们final
使它们编译时间常数(如果直接初始化而不是方法的结果)和int
是原语。因此,final int
使不可变,因此线程安全。