繁体   English   中英

Java中静态块的线程安全

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

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

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

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

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

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

由于 Java 编程语言是多线程的,类或接口的初始化需要仔细的同步,因为其他线程可能会同时尝试初始化相同的类或接口

引用自Java 语言规范

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM