41

假设我有一些 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 的Class对象,并且正在初始化静态块中的值,而第二个线程想要Class再次加载 SomeClass,那么静态块会发生什么?即使第一个线程没有完成,第二个线程是否会忽略它假设它已经初始化?还是发生了其他事情?

4

5 回答 5

51

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

这在第 12.4.2 节的 Java 语言规范中有详细说明。

于 2009-01-20T19:28:40.697 回答
17

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

于 2009-01-20T19:25:00.453 回答
2

请注意,您不要调用需要锁定正在初始化的类的代码 - 它会死锁。看到这篇博文:http ://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/

于 2009-01-21T10:05:49.597 回答
0

静态块在初始化时始终是线程安全的。这就是为什么使用单例对象的静态变量作为创建单例对象的一种方式(单例设计模式)。

于 2020-06-12T17:07:37.713 回答
0

因为 Java 编程语言是多线程的,所以类或接口的初始化需要仔细同步,因为其他一些线程可能试图同时初始化同一个类或接口

引用自Java 语言规范

于 2021-06-02T11:51:52.237 回答