gpt4 book ai didi

java - 这段java代码是如何产生死锁的?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:34:09 27 4
gpt4 key购买 nike

我正在查看 oracle 文档以了解死锁..我找到了这段代码

public class Deadlock {
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}

public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
}
}

我没看懂,什么情况下会发生死锁?

我运行这段代码,它工作正常。所以一定有什么特殊事件,什么时候会发生死锁?

假设首先在 alphonse 对象上调用 bow,当 bower.bowBack(this) 被调用时,它是否会保留对 alphonse 对象的锁定在凉亭对象上?因为如果它保留了它的锁,另一个对象上的 bow 函数将不会获得锁,直到 alphonse 离开它的锁,并且永远不会出现死锁情况..

最佳答案

如果在打印第一行之后和调用 bowBack 之前放置 Thread.sleep(1000),您应该会看到死锁。这种死锁无论如何都可能发生,这种情况将很少见。

你有两个线程和两个正在获取的锁是不同的顺序。这会使每个线程持有一个锁但无法获得第二个锁。即死锁。

注意:线程启动需要很长时间,这意味着第一个线程可以在第二个线程启动之前运行完成,因此您不太可能会看到问题。


这是给你的益智游戏。这会造成死锁,您能看出原因吗?

class A {
static final int i;
static {
i = 128;

Thread t = new Thread() {
public void run() {
System.out.println("i=" + i);
}
};
t.start();
try {
t.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}

关于java - 这段java代码是如何产生死锁的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17235212/

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