您不仅在 启动 另一个线程-您还在 加入
它。该新线程必须等待
StaticInitializer完全初始化才能继续,因为它正在尝试设置
state字段…并且初始化已经在进行中,因此它等待。但是,它将永远等待,因为初始化正在等待该新线程终止。经典僵局。
有关类初始化涉及的细节,请参见Java语言规范第12.4.2节。重要的是,初始化线程将“拥有”监视器
StaticInitializer.class,但
新 线程将等待获取该监视器。
换句话说,您的代码有点像这个非初始化代码(省略了异常处理)。
final Object foo = new Object();synchronized (foo){ Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (foo) { System.out.println("In the new thread!"); } }); t1.start(); t1.join();});如果您能理解 该 代码为何会陷入僵局,那么您的代码基本上是相同的。
道德上不要在静态初始化程序中做很多工作。



