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

Java 哪个线程正在初始化静态字段?,java,Java,哪个线程正在初始化静态字段和静态块?从我的实验中,我得出结论,它与“调用”线程相同,即 class Foo { static { System.err.printf("static {}: %s\n", Thread.currentThread()); } } public class Mini_StaticInitialization { public static void main(final String[] args) {

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

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]

是否有任何限制或总是这样

加载类时将运行静态块。我假设这始终是导致类加载的线程。如果类以某种方式被引用,这可能是一个不同的线程,即使您没有创建Foo的实例。

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

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

JLS最相关的部分可能是:

因为Java编程语言是多线程的,所以类或接口的初始化需要仔细的同步,因为其他一些线程可能试图同时初始化同一个类或接口


这意味着(但不说明或要求)初始化发生在导致类需要初始化的线程中。

静态块中的代码在类加载时执行,并且只执行一次,无论创建了多少个类实例。在您的程序中,主线程位于调用线程中,并且您的程序在同一线程中运行。如果您尝试在不同的线程中执行new Foo(),您也会看到相同的输出,因为静态初始化仅在调用线程中发生。

正是第一个加载的Foo将初始化静态字段/运行静态块的线程。如果Foo已经被另一个线程加载,那么线程[main,5,main]将不会接触它们。静态初始化只完成一次。

您的应用程序是单线程的。它的执行都发生在同一个线程中。那么,“什么线程…”是什么意思呢?上面显示的应用程序只有一个线程。出于好奇:你为什么会关心哪个线程执行静态块?@scottb这是一个测试用例来阐述我的问题,显然这不是我的应用程序。严格地说,这是在类初始化时发生的,而不是在类加载时发生的。大多数情况下,这两种情况几乎同时发生,但并不总是如此。