java - 多线程中困惑的输出显示死锁?

标签 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();
}
}

我的计算机上的输出是

mainthreadentered A.foo

racingthreadentered B.bar

mainthreadtrying to call B.last()

racingthreadtrying to call A.last()

最佳答案

你遇到了典型的僵局。

  • A.foo() 锁定 a 并调用 b.last() 尝试锁定 b
  • B.bar() 锁定 b1 并调用 a.last() 尝试锁定 a

双方都无法继续,因为双方都需要对方的锁。

I don't know why the threads are in deadlock situation.

因为这就是你的程序的设计目的。


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

关于java - 多线程中困惑的输出显示死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164274/

相关文章:

java - 使用 Javamail 通过 imap 访问 gmail(在代理后面)

java - 为什么以下应用程序在使用 ForkJoinPool 时会立即终止,而在我使用 ThreadPoolExecutor 时却不会?

c# - 并行.For "Thread local state"

c++ - 为什么我的互斥量没有在我的其他线程锁定它之前锁定它?

c++ - 在没有线程句柄的情况下从 C/C++ 线程内终止线程

multithreading - 如何通过工作线程更改进度

java - Android:无法获得可点击的 ListView 页眉/页脚

java - 在 View 缓冲区上添加 float 组不会增加位置是否正常?

java - 添加两个包含二进制数的字符串

java - 有没有办法让 g.drawstring 显示随机字符串