java - 哪个线程正在初始化静态字段?

标签 java

哪个线程正在初始化静态字段和静态 block ?从我的实验中我得出结论,它与“调用”线程相同,即

class Foo {
    static {
        System.err.printf("static {}:   %s\n", Thread.currentThread());
    }
}

public class Mini_StaticInitialization {
    public static void main(final String[] args) {
        System.err.printf("main:        %s\n", Thread.currentThread());
        new Foo();
    }
}

输出

main:        Thread[main,5,main]
static {}:   Thread[main,5,main]

是否有任何限制或总是如此?

最佳答案

通常静态字段在首先初始化类的线程中初始化,但我认为 JLS 中没有指定。

通常也是加载类的同一个线程,但不一定。

JLS 最相关的部分可能是 12.4.2. Detailed Initialization Procedure :

Because the Java programming language is multithreaded, initialization of a class or interface requires careful synchronization, since some other thread may be trying to initialize the same class or interface at the same time.

暗示(但不声明或要求)初始化发生在导致类需要初始化的线程中。

关于java - 哪个线程正在初始化静态字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19444616/

相关文章:

java - 使用数组按姓名和分数对学生进行排序

java - 创建自定义 JNDI 资源

java - 并行化简操作

java - 使用 glMapBuffer 的优点

java - 具有未定义字段数的 Morphia 更新文档

java - String赋值会导致内存泄漏吗?

java - 在 Spring MVC/JSP/Controller 中从列表框中获取用户的选择

Java Swing JScrollPane 显示的输出与书中显示的不同。行标签在 Java 中消失了

java - JLabel 没有去我想要它去的地方

java - 从用户输入创建 XML 元素