public static final int thread是否安全?

时间:2014-09-16 11:59:05

标签: java thread-safety

我想要一个从多个线程访问常量的文件。为此创建一个具有大量public static final int s的类是安全的实现吗?

4 个答案:

答案 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使不可变,因此线程安全