静态类初始值设定项 - 是否存在需要同步的情况?

时间:2013-03-17 17:06:42

标签: java static synchronization initialization

我有一种情况,我想初始化一些静态的,“常量”(即初始化后未修改)的数据结构。我在“静态{}”代码块中执行此操作。是否保证此代码块永远不会被激活两次?在某些特殊情况下我是否需要同步?

更新:答案部分在Are Java static initializers thread safe?

中给出

仍然是一个问题:如何不止一次执行静态初始化程序?这有关系吗?我猜它对不同的静态“实例”运行不止一次,即。在不同的webapp上下文中,并附加到不同的类加载器,使得它们不会彼此“看到”。正确的吗?

2 个答案:

答案 0 :(得分:2)

JVM保证所有类的静态初始化程序块只被调用一次(首次加载类时)。由于它只会被调用一次,因此不需要任何同步代码,因为这与 Only Once 规则相矛盾。

有关类加载和静态类初始化程序的更多信息,请查看here

从该页面引用:

  

编译器实际上做的是在内部生成单个类初始化例程,该例程将所有静态变量初始化器和所有静态初始化器代码块按它们在类声明中出现的顺序组合在一起。首次加载类时,此单个初始化过程仅自动运行一次。    -David Flanagan

答案 1 :(得分:1)

  

我想初始化一些静态的,“常量”(即初始化后未修改)的数据结构

将该变量设为最终。

public static final CONSTANT = 10;

OR

您可以将该代码放在静态块中。它在类加载时执行一次。