Java 中静态块的线程安全性

2022-09-01 01:01:17

假设我有一些Java代码:

public class SomeClass {
    static {
        private final double PI = 3.14;
        private final double SOME_CONSTANT = 5.76;
        private final double SOME_OTHER_CONSTANT = 756.33;
    }

  //rest of class
}

如果一个线程正在初始化 SomeClass 的对象,并且当第二个线程想要再次加载 SomeClass 的对象时,正在初始化静态块中的值,那么静态块会发生什么情况?假设第二个线程已经初始化,即使第一个线程未完成,它是否会忽略它?还是发生了其他事情?ClassClass


答案 1

如果第一个线程尚未完成对 SomeClass 的初始化,则第二个线程将阻塞。

Java 语言规范第 12.4.2 节中对此进行了详细介绍。


答案 2

Java 保证静态类初始化是线程安全的。


推荐