我有以下课程。
public class B
{
public A a;
public B()
{
a= new A();
System.out.println("Creating B");
}
}
和
public class A
{
public B b;
public A()
{
b = new B();
System.out.println("Creating A");
}
public static void main(String[] args)
{
A a = new A();
}
}
可以清楚地看到,类之间存在循环依赖关系。如果我尝试运行 A 类,我最终会得到一个StackOverflowError
.
如果创建了一个依赖图,其中节点是类,则可以轻松识别这种依赖关系(至少对于具有少量节点的图)。那么为什么 JVM 至少在运行时没有识别出来呢?StackOverflowError
JVM 至少可以在开始执行之前发出警告,而不是 throwing 。
[更新]某些语言不能有循环依赖,因为那样源代码将无法构建。例如,请参阅此问题和接受的答案。如果循环依赖是 C# 的一种设计味道,那么为什么它不是 Java 的呢?仅仅因为Java可以(编译具有循环依赖的代码)?
[update2]最近发现jCarder。根据该网站,它通过动态检测 Java 字节码并在对象图中查找循环来发现潜在的死锁。谁能解释该工具如何找到循环?