gpt4 book ai didi

java - 如何诊断或检测 Java 静态初始化程序中的死锁

转载 作者:搜寻专家 更新时间:2023-10-30 21:12:39 24 4
gpt4 key购买 nike

(在 Java 中使用静态初始值设定项是否是一个好主意超出了这个问题的范围。)

我在我的 Scala 应用程序中遇到了死锁,我认为这是由编译类中的互锁静态初始化程序引起的。

我的问题是如何检测和诊断这些死锁——我发现当涉及静态初始化程序 block 时,常规的 JVM 死锁工具似乎不起作用。

这是一个简单的示例 Java 应用程序,它在静态初始化程序中死锁:

public class StaticDeadlockExample implements Runnable
{
static
{
Thread thread = new Thread(
new StaticDeadlockExample(),
"StaticDeadlockExample child thread");
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args)
{
System.out.println("in main");
}

public static void sayHello()
{
System.out.println("hello from thread " + Thread.currentThread().getName());
}

@Override
public void run() {
StaticDeadlockExample.sayHello();
}
}

如果您启动这个应用程序,它就会死锁。死锁时的堆栈跟踪(来自 jstack)包含以下两个死锁线程:

"StaticDeadlockExample child thread" prio=6 tid=0x000000006c86a000 nid=0x4f54 in Object.wait() [0x000000006d38f000]
java.lang.Thread.State: RUNNABLE
at StaticDeadlockExample.run(StaticDeadlockExample.java:37)
at java.lang.Thread.run(Thread.java:619)

Locked ownable synchronizers:
- None

"main" prio=6 tid=0x00000000005db000 nid=0x2fbc in Object.wait() [0x000000000254e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x000000004a6a7870> (a java.lang.Thread)
at java.lang.Thread.join(Thread.java:1143)
- locked <0x000000004a6a7870> (a java.lang.Thread)
at java.lang.Thread.join(Thread.java:1196)
at StaticDeadlockExample.<clinit>(StaticDeadlockExample.java:17)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:116)

Locked ownable synchronizers:
- None

我的问题如下

  1. 为什么第一个线程被标记为 RUNNABLE,而实际上它正在等待锁?我能以某种方式检测到该线程的“真实”状态吗?
  2. 为什么两个线程都没有标记为拥有任何(相关)锁,而实际上一个线程持有静态初始化器锁而另一个正在等待它?我能以某种方式检测静态初始化程序锁所有权吗?

最佳答案

Scala 很容易落入陷阱。

简单的解决方法或诊断(如果您在堆栈跟踪中看到 clinit)是让您的对象扩展 App 以让 DelayedInit 将您的代码从静态初始化器中移除。

一些澄清链接:

https://issues.scala-lang.org/browse/SI-7646

Scala: Parallel collection in object initializer causes a program to hang

http://permalink.gmane.org/gmane.comp.lang.scala.user/72499

关于java - 如何诊断或检测 Java 静态初始化程序中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27549671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com