先舉個栗子。
/**
* Created by Benjamin on 07/30/030.
*/
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
@Override
public void run() {
System.out.println("flag = " + flag);
if (flag==1){
synchronized (o1) {
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("1");
}
}
}
if (flag==0){
synchronized (o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
TestDeadLock t1 = new TestDeadLock();
TestDeadLock t2 = new TestDeadLock();
t1.flag = 1;
t2.flag = 0;
new Thread(t1).start();
new Thread(t2).start();
}
}
產生死鎖的原因主要是:
- 系統資源不足
- 資源分配不當
- 推進順序不合適
產生死鎖的四個必要條件:
- 互斥:一個資源每次只能被一個進程使用
- 資源保持:一個進程被阻塞時,不釋放已有資源
- 不可搶占:正在使用的資源不能被剝奪
- 循環等待:循環等待未被分配的資源
例子死鎖的原因:
靜態對象o1和o2是類的資源。當flag=1
的線程請求到o1資源時,再申請資源o2時,o2資源已經被flag=0
的線程占有,并且后者需要申請資源o1才能繼續執行。這樣,二者就形成了相互等待的情形,故而形成死鎖。