The Java™ Tutorials — Concurrency :Deadlock 死锁
2016-02-15 21:50
495 查看
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。
相关文章推荐
- 使用 Syncthing 在多个设备间同步文件
- C#实现多线程的同步方法实例分析
- Oracle外键不加索引引起死锁示例
- C#线程间不能调用剪切板的解决方法
- 科学知识:同步、异步、阻塞和非阻塞区别
- 同步文件备份工具 Super Flexible File Synchronizer Pro v4
- 探讨Ajax中同步与异步之间的区别
- SQL2008中SQL应用之- 死锁(Deadlocking)
- 详解SQL死锁检测的方法
- MySQL中join语句的基本使用教程及其字段对性能的影响
- C#中lock死锁实例教程
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- SQL 外链接操作小结 inner join left join right join
- C#线程队列用法实例分析
- 记一次公司仓库数据库服务器死锁过程及解决办法
- SQL语句的并集UNION 交集JOIN(内连接,外连接)等介绍