java - java中的类初始化和死锁
问题描述
当两个同时初始化这些时,以下代码会导致initialization
相互依赖的类。deadlocks
threads
classes
我无法找到此问题的根本原因。
class A {
static boolean x = B.b;
static boolean a = true;
}
class B {
static boolean b = true;
static {
if (A.a)
throw new Error();
}
}
public class Test {
public static void main(String[] args) {
Thread t1 = new Thread() {
public void run() {
new A();
}
};
Thread t2 = new Thread() {
public void run() {
new B();
}
};
t1.start();
t2.start();
}
}
请帮助我了解这个死锁的根本原因以及如何修复它。
解决方案
当两个线程持有不同的锁并试图获取其他线程持有的锁时,就会发生死锁。
在这种情况下,它发生在
t1
持有 的初始化锁class A
,并尝试获取 的初始化锁class B
。while
t2
持有 的初始化锁class B
,并尝试获取 的初始化锁class A
。
您可以通过按顺序执行来避免竞争t1
条件t2
:
t1.start();
t1.join();
t2.start();
t2.join();
来自jls的更多详细信息:
对于每个类或接口 C,都有一个唯一的初始化锁 LC。
……
对于每个类或接口 C,都有一个唯一的初始化锁 LC。从 C 到 LC 的映射由 Java 虚拟机实现决定。初始化 C 的过程如下:
在 C 的初始化锁 LC 上同步。这包括等待当前线程可以获取 LC。
...
推荐阅读
- bash - 并排组合两个具有多行值的变量
- html - TypeScript:ev.target 和 Node.contains:EventTarget 不可分配给 Node
- python - 如何将十六进制私钥变成私钥 WIF Compressed
- php - PHP,是否有可能,如果它是一个简单的过程,如何覆盖美元符号,$?
- c - (C) 当终止值为 [^\n] 时 scanf 不工作
- android - 为什么我的应用程序的状态栏会自动隐藏?
- cmake - 通过`add_subdirectory`添加的库面临“编译时没有规则来制作目标..”错误
- java - 为什么在构造的 JPanel 中,组件的某些属性被表达,而其他的却没有?
- java - 使用 jdbctemplate 将查询中的数据保存在模型中
- networkx - node_link_graph 中有什么?