gpt4 book ai didi

java - 多线程中的混淆输出显示死锁?

转载 作者:行者123 更新时间:2023-11-30 06:28:47 24 4
gpt4 key购买 nike

我刚刚编译并运行了这个 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 并调用试图锁定 bb.last()
  • B.bar() 锁定 b1 并调用试图锁定 aa.last()

两者都无法继续,因为每个都需要对方的锁。

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

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


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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com