死鎖指的是兩個或者多個線程,因爭奪資源而造成的相互等待的情況。
產生死鎖的原因有主要還是系統資源分配不均(系統資源不足)。
死鎖有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了