Java中静态块的线程安全性

时间:2009-01-20 19:22:26

标签: java multithreading static

假设我有一些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的第二个实例时正在初始化静态块中的值,静态块会发生什么?第二个线程是否忽略它,假设它已经初始化,即使第一个线程没有完成?还是会发生其他事情?

5 个答案:

答案 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编程语言是多线程的,初始化 类或接口的同步需要仔细的同步,因为一些 其他线程可能正在尝试初始化相同的类或接口 同时

引用自 Java Language Specification