一、死锁的规范定义
集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。
二、直观的例子
两个人吃饭,都需要刀和叉,但刀叉又只有一套。某时刻,其中一个人拿了刀,另一个拿了叉,而且两人都在等待对方让出自己需要的叉或刀。这种情形下,两个人都只能一直等待下去,这就是发生了死锁。
三、程序演示死锁
static void deadLock() {
final Object knife = new Object();
final Object fork = new Object();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (knife) {
while (true) {
System.out.println(Thread.currentThread().getName() + " has knife");
synchronized (fork) {
System.out.println(Thread.currentThread().getName() + " get fork");
}
}
}
}
}, "Linda").start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (fork) {
while (true) {
System.out.println(Thread.currentThread().getName() + " has fork");
synchronized (knife) {
System.out.println(Thread.currentThread().getName() + " get knife");
}
}
}
}
}, "Lisa").start();
}
四、死锁产生的必要条件
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。