我有一种情况,我想初始化一些静态的“常量”(即初始化后不修改)数据结构。我在“静态{}”代码块中执行此操作。是否保证此代码块永远不会被执行两次?在某些特殊情况下我需要同步吗?
更新:答案部分在Are Java static initializers thread safe?
问题仍然存在:如何多次执行静态初始化程序?这有关系吗?我猜它对于不同的静态“实例”运行不止一次,即。在不同的 webapp 上下文中并附加到不同的类加载器,这样它们就不会“看到”彼此。正确的?
我有一种情况,我想初始化一些静态的“常量”(即初始化后不修改)数据结构。我在“静态{}”代码块中执行此操作。是否保证此代码块永远不会被执行两次?在某些特殊情况下我需要同步吗?
更新:答案部分在Are Java static initializers thread safe?
问题仍然存在:如何多次执行静态初始化程序?这有关系吗?我猜它对于不同的静态“实例”运行不止一次,即。在不同的 webapp 上下文中并附加到不同的类加载器,这样它们就不会“看到”彼此。正确的?
JVM 保证所有类静态初始化块只被调用一次(当类第一次加载时)。由于它只会被调用一次,因此不需要任何同步代码,因为这与Only Once规则相矛盾。
在这里查看更多关于类加载和静态类初始化器的信息。
从该页面引用:
编译器实际上做的是在内部生成一个单独的类初始化例程,该例程将所有静态变量初始化器和所有静态初始化器代码块按照它们在类声明中出现的顺序组合在一起。当类第一次加载时,这个单一的初始化过程会自动运行一次,只有一次。 ——大卫弗拉纳根
我想初始化一些静态的“常量”(即初始化后不修改)数据结构
将该变量设为最终变量。
像
public static final CONSTANT = 10;
或者
您可以将该代码放在静态块中。它在类加载时执行一次。