死锁概念
多个并发进程因争夺系统资源而产生相互等待的现象
四个条件
互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
常用的解除死锁的方法:
1、抢占资源:从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。
2、终止(或撤销)进程:终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。
a、终止所有的死锁进程。这种方式简单粗暴,但是代价很大,很有可能会导致一些已经运行了很久的进程前功尽弃。
b、逐个终止进程,直至死锁状态解除。该方法的代价也很大,因为每终止一个进程就需要使用死锁检测来检测系统当前是否处于死锁状态。另外,每次终止进程的时候终止那个进程呢?每次都应该采用最优策略来选择一个“代价最小”的进程来解除死锁状态。
一般根据如下几个方面来决定终止哪个进程:
进程的优先级
进程已运行时间以及运行完成还需要的时间
进程已占用系统资源
进程运行完成还需要的资源
终止进程数目
进程是交互还是批处理
package com.jerry.Thread;
class Jerry{
public void say(){
System.out.println("jerry对barry说:不行,你要先请我吃饭");
}
public void eat(){
System.out.println("barry请jerry吃饭");
}
}
class Barry{
public void say(){
System.out.println("barry对jerry说:你请我吃饭,我就请你吃饭");
}
public void eat(){
System.out.println("jerry请barry吃饭");
}
}
public class MyDeadLock implements Runnable{
public static Jerry jerry=new Jerry();
public static Barry barry=new Barry();
public boolean flag=false;
public void run() {
if (flag){
synchronized (jerry){
jerry.say();
try{
Thread.sleep(500);
}catch (InterruptedException ex){
ex.printStackTrace();
}
synchronized (barry){
jerry.eat();
}
}
}
else {
synchronized (barry){
barry.say();
try{
Thread.sleep(500);
}catch (InterruptedException ex){
ex.printStackTrace();
}
synchronized (jerry){
barry.eat();
}
}
}
}
public static void main(String[] args) {
MyDeadLock t1=new MyDeadLock();
MyDeadLock t2=new MyDeadLock();
t1.flag=true;
t2.flag=false;
Thread tha=new Thread(t1);
Thread thb=new Thread(t2);
tha.start();
thb.start();
}
}