假设我有一些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的第二个实例时正处于初始化静态块中的值的中间,那么静态块会发生什么?即使第一个线程未完成,第二个线程是否仍假设它已初始化而忽略了它?还是发生其他事情?
如果第一个线程尚未完成对SomeClass的初始化,则第二个线程将阻塞。
这在section 12.4.2的Java语言规范中有详细说明。
Java保证静态类的初始化是线程安全的。
请注意,您不会调用需要初始化类的锁的代码-它将死锁。请参阅此博客文章:http://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/
很长一段时间以后,我在这个问题中看到了一些令人困惑的事情,我想值得一提。第一个实例和第二个实例如此混乱,因为在创建SomeClass
的实例时不会执行静态块,因此当ClassLoader
加载类的类对象时,将初始化类并为其执行静态块。但是,由于类Object的初始化是线程安全的,因此线程安全的答案仍然相同。