Java中静态块的线程安全

问题描述 投票:40回答:4

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

java multithreading static
4个回答
48
投票

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

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


15
投票

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


2
投票

请注意,您不会调用需要初始化类的锁的代码-它将死锁。请参阅此博客文章:http://ramblingabout.wordpress.com/2008/04/10/deadlock-quiz-the-answer/


0
投票

很长一段时间以后,我在这个问题中看到了一些令人困惑的事情,我想值得一提。第一个实例和第二个实例如此混乱,因为在创建SomeClass的实例时不会执行静态块,因此当ClassLoader加载类的类对象时,将初始化类并为其执行静态块。但是,由于类Object的初始化是线程安全的,因此线程安全的答案仍然相同。

© www.soinside.com 2019 - 2024. All rights reserved.