Java中静态块的线程安全性

假设我有一些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,则第二个线程将被阻塞。

这在Java语言规范的12.4.2节中有详细描述。

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

注意你不要调用那些需要初始化类的锁 – 它会死锁。 看到这个博客文章: http : //ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/