The Java™ Tutorials — Concurrency :Deadlock 死锁

The Java™ Tutorials — Concurrency :Deadlock 死锁

原文地址:https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html

关键点

  • 发生条件: 
    • 请求和保持
    • 资源互斥
    • 循环等待
    • 不可抢夺

全文翻译

Deadlock describes a situation where two or more threads are blocked forever, waiting for each other. Here’s an example.

死锁描述了这样一种情况——一个或多个线程永远地阻塞,并一直等待着对方。看这个例子。

Alphonse and Gaston are friends, and great believers in courtesy. A strict rule of courtesy is that when you bow to a friend, you must remain bowed until your friend has a chance to return the bow. Unfortunately, this rule does not account for the possibility that two friends might bow to each other at the same time. This example application, Deadlock, models this possibility:

Alphonse和Gaston是好友,并释放注意礼节。礼节中一个严苛的规定就是,当你想一个朋友鞠躬时,你必须保持鞠躬的姿势知道你的朋友有机会起身。不幸的是,此规则无法对这种情况适用,那就是两个朋友同时向对方鞠躬。下面的这个程序,Deadlock,很好地模拟了这个场景:

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

When Deadlock runs, it’s extremely likely that both threads will block when they attempt to invoke bowBack. Neither block will ever end, because each thread is waiting for the other to exit bow.

当Deadlock运行时,两个线程在尝试调用bowBack时发生阻塞。两边的阻塞都不会停止,因为它们都在等待对方退出bow。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值