java - 在这个例子中如何检查死锁
问题描述
目前我正在学习死锁,我发现了一个死锁的例子,但我不明白这个例子中死锁是如何发生的。
public class Main {
public static void main(String[] args) {
final PolitePerson jane = new PolitePerson("Jane");
final PolitePerson john = new PolitePerson("John");
new Thread(new Runnable() {
@Override
public void run() {
jane.sayHello(john);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
john.sayHello(jane);
}
}).start();
}
static class PolitePerson {
private final String name;
public PolitePerson(String name) {
this.name = name;
}
public String getName() {
return name;
}
public synchronized void sayHello(PolitePerson person){
System.out.format("%s: %s" + " has said hello to me!%n", this.name, person.getName());
person.sayHelloBack(this);
}
public synchronized void sayHelloBack(PolitePerson person) {
System.out.format("%s: %s" + " has said hello back to me!%n", this.name, person.getName());
}
}
}
我花了一个多小时来了解这里的情况,但没有得到它。这是我得到的输出
Jane: John has said hello to me!
John: Jane has said hello to me!
或者我在这里误解了同步。
解决方案
标有 的方法synchronized
锁定临界区(方法),this
用作锁。要进入临界区(并锁定它),线程需要获取相应的锁。如果该部分已经被锁定,则线程在入口处被阻塞并等待锁被释放。
A 和 B 是线程:
- A 调用
jane.sayHello(john)
和锁定jane
。 - B 调用
john.sayHello(jane)
并锁定john
。
请注意sayHello
标有synchronized
。
- 阿来电
person.sayHelloBack(this)
,在person
哪里john
。 - B 来电
person.sayHelloBack(this)
,在person
哪里jane
。
请注意,sayHelloBack
它也标有synchronized
。
B 持有
john
,因此 A 的呼叫john.sayHelloBack
被阻止。A 持有
jane
,因此 B 的呼叫jane.sayHelloBack
被阻止。A 正在等待 B 释放锁,反之亦然。
僵局。
推荐阅读
- node.js - 登录路径不起作用 - 我总是得到“错误的用户名” ----- 堆栈:NodeJS/Express/MongoDB/Mongoose/RestAPI
- r - 如何通过R中的ggplot在具有双y轴的同一图表中绘制条形和线
- macos - 在 macOS 上启动 Pip3 install package_name
- javascript - 无法将值输入到不可见的网格
- gdb - 使用 --args 选项时重定向 gdb 的输出
- python - 按键时python追加到列表
- typescript - 我可以在条件类型中保留泛型吗?
- fullcalendar - Fullcalendar 将某天的事件转移到某些客户身上
- c++ - 在 C++ 中实现虚函数和运行时多态性时的编译时错误
- javascript - 错误:podfile 更新后 `Podfile` 中的 `React` 具有不同来源的多个依赖项