如果在静态初始化程序块中创建线程,程序将挂起

如果在静态初始化程序块中创建线程,程序将挂起,第1张

如果在静态初始化程序块中创建线程,程序将挂起

您不仅在 启动 另一个线程-您还在 加入
它。该新线程必须等待

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();});

如果您能理解 代码为何会陷入僵局,那么您的代码基本上是相同的。

道德上不要在静态初始化程序中做很多工作。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5176861.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-18
下一篇2022-11-18

发表评论

登录后才能评论

评论列表(0条)

    保存