Java中的Stack Overflow异常

Sub*_*dal 2 java

我是Thread的新手.我创建了两个名为A和B的类,如下所示 -

public class A {

    private B b;

    public void setB(B b) {
        this.b = b;
    }

    synchronized void foo() {
        b.foo();
        System.out.println("Hi A");
    }
}

public class B {

    private A a;

    public void setA(A a) {
        this.a = a;
    }

    synchronized void foo() {
        a.foo();
        System.out.println("Hi B");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我创建了另外两个实现Runnable接口的类.

public class AThread implements Runnable{
    private A a;
    public AThread(A a){
        this.a = a;
    }
    @Override
    public void run() {
        a.foo();
    }

}

public class BThread implements Runnable {
    private B b;
    public BThread(B a){
        this.b = b;
    }
    @Override
    public void run() {
        b.foo();
    }

}
Run Code Online (Sandbox Code Playgroud)

在主要方法中,我写了以下代码 -

public static void main(String args[]) {
        A a = new A();
        B b = new B();
        a.setB(b);
        b.setA(a);
        Runnable r1 = new AThread(a);
        Runnable r2 = new BThread(b);
        Thread t1 = new Thread(r1);
        t1.start();

    }
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到以下异常.

Exception in thread "Thread-0" java.lang.StackOverflowError
    at student.B.foo(B.java:21)
    at student.A.foo(A.java:21)..
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释它的原因是什么,我该如何解决?

Era*_*ran 11

你有什么期望?

你有一个foo()方法在A调用foo()方法中B调用foo()方法A,依此类推,直到堆栈溢出.

您可以通过避免循环方法调用来解决它.

  • @SubhabrataMondal你为什么期待死锁?您正在一个线程中运行这些循环调用. (4认同)