死锁指的是两个或者多个线程,因争夺资源而造成的相互等待的情况。
产生死锁的原因有主要还是系统资源分配不均(系统资源不足)。
死锁有4个必须满足的条件:
1. 请求保持条件。至少得有一个线程已经拿到了A资源,又去请求B资源
2. 不可剥夺。拿到资源后,不能被强行夺走。
3.互斥条件。使用的资源至少要有一个是不能共享的,需要互斥访问。
4.循环等待条件。A等B,B等C
也就是说只要破坏这四个条件中的任何一个,死锁便不成立。
public class DeadLock implements Runnable{
boolean flag ;
static Object o1 = new Object();
static Object o2 = new Object();
public DeadLock(boolean flag){
this.flag = flag;
}
public static void main(String[] args){
Thread t1 = new Thread(new DeadLock(true));
Thread t2 = new Thread(new DeadLock(false));
t1.start();
t2.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
if(this.flag){
synchronized(o1){
try{
System.out.println("t1 拿到o1了");
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o2){
System.out.println("t1 拿到o2了");
}
}
}else{
synchronized(o2){
try{
System.out.println("t2 拿到o2了");
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(o1){
System.out.println("t2 拿到o1了");
}
}
}
}
}
输出是这样,然后便卡着不动了。
t1 拿到o1了
t2 拿到o2了