[英]What thread is initializing static fields?
什么线程正在初始化静态字段和静态块? 从我的实验中我得出结论,它与“调用”线程相同,即
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实例。
静态块中的代码在类加载时执行,并且只执行一次,无论您创建的类的实例数是多少。 在您的程序主线程中,调用线程和您的程序在同一个线程中运行。 如果您尝试在另一个线程中执行新的Foo(),您将看到与仅在调用线程中发生静态初始化相同的输出。
首先加载Foo的线程将初始化静态字段/运行静态块。 如果Foo已被另一个线程加载,则Thread [main,5,main]将不会触及它们。 静态初始化完成一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.