假设我有一些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的第二个实例时正在初始化静态块中的值,静态块会发生什么?第二个线程是否忽略它,假设它已经初始化,即使第一个线程没有完成?还是会发生其他事情?
答案 0 :(得分:46)
如果第一个线程尚未完成初始化SomeClass,则第二个线程将阻塞。
这在section 12.4.2中的Java语言规范中有详细说明。
答案 1 :(得分:15)
Java保证静态类初始化是线程安全的。
答案 2 :(得分:2)
注意你不要调用需要为正在初始化的类的锁的代码 - 它会死锁。请参阅此博文:http://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/
答案 3 :(得分:0)
静态块在初始化时始终是线程安全的。这就是使用单例对象的 static 变量作为创建单例对象的一种方法(单例设计模式)的原因。
答案 4 :(得分:0)
由于Java编程语言是多线程的,初始化 类或接口的同步需要仔细的同步,因为一些 其他线程可能正在尝试初始化相同的类或接口 同时