在多线程中混淆输出显示死锁?

kTi*_*ari 2 java multithreading

我只是编译并运行java程序,但输出很不愉快.我不知道为什么线程处于死锁状态.任何人都可以帮助我理解程序的输出.

class A {
synchronized void foo(B b) {
    String name=Thread.currentThread().getName();
    System.out.println(name+"entered A.foo");

    try {
        Thread.sleep(1000);
    } catch(Exception e) {}
    System.out.println(name+"trying to call B.last()");
    b.last();
}
synchronized void last() {
    System.out.println("inside A.last");
}
}

class B {
synchronized void bar(A a) {
    String name=Thread.currentThread().getName();
    System.out.println(name+"entered B.bar");
    try {
        Thread.sleep(1000);
    } catch(Exception e) {
        System.out.println("b interrupted");
    }
    System.out.println(name+"trying to call A.last()");
    a.last();
}
synchronized void last() {
    System.out.println("inside A.last");
}
}

class DeadLock implements Runnable {
A a=new A();
B b=new B();
DeadLock() {
    Thread.currentThread().setName("mainthread");
    Thread t=new Thread(this,"racingthread");
    t.start();
    a.foo(b);
    System.out.println("back in main thread");
}
public void run() {
    b.bar(a);
    System.out.println("back in other theread");
}
public static void main(String...d) {
    new DeadLock();
}
}
Run Code Online (Sandbox Code Playgroud)

我的电脑上的输出是

mainthreadentered A.foo

racingthreadentered B.bar

mainthreadtrying to call B.last()

racingthreadtrying to call A.last()
Run Code Online (Sandbox Code Playgroud)

Pet*_*rey 5

你有一个经典的僵局.

  • A.foo()试图锁定的锁a和调用b.last()b
  • B.bar()试图锁定的锁b1和调用a.last()a

两者都不能继续,因为每个人都需要另一个人的锁定.

我不知道为什么线程处于死锁状态.

因为这是您的程序的目的.


鉴于您不需要任何锁,最简单的解决方案是删除所有synchronized关键字.