在Java构造函数中存在循环依赖。
- 论坛
- 在Java构造函数中存在循环依赖。
10 浏览
在Java构造函数中存在循环依赖。
我有以下的类。
public class B {
public A a;
public B() {
a= new A();
System.out.println("创建 B");
}
}
和
public class A {
public B b;
public A() {
b = new B();
System.out.println("创建 A");
}
public static void main(String[] args) {
A a = new A();
}
}
可以明显看出,这些类之间存在循环依赖关系。如果我尝试运行类 A,最终会出现 StackOverflowError 错误。
如果创建一个依赖图,其中节点是类,那么这种循环依赖关系可以很容易地被识别出来(至少对于节点较少的图形而言)。那么为什么 JVM 在运行时不识别这一点呢? JVM 在开始执行之前,至少可以在抛出 StackOverflowError 错误之前给出警告。
[更新] 有些语言不能有循环依赖关系,因为这样源代码将无法构建。例如,参见这个问题和被接受的回答。如果循环依赖关系是 C# 的设计问题,那么为什么 Java 不是呢?只是因为 Java 可以编译带有循环依赖关系的代码吗?
[更新2] 最近发现了 jCarder。根据网站上的介绍,它通过动态插装 Java 字节码并查找对象图中的循环来发现潜在的死锁。有人可以解释一下这个工具是如何找到循环的吗?