1. 程式人生 > >一個簡單的Java死鎖示例

一個簡單的Java死鎖示例

在實際程式設計中,要儘量避免出現死鎖的情況,但是讓你故意寫一個死鎖的程式時似乎也不太簡單(有公司會出這樣的面試題),以下是一個簡單的死鎖例子,程式說明都寫著類的註釋裡了,有點羅嗦,但是應該也還是表述清楚了的。

[code=java]

/**
* 一個簡單的死鎖類
* @author iStar
* 當類的物件flag=1時(T1),先鎖定O1,睡眠500毫秒,然後鎖定O2;
* 而T1在睡眠的時候另一個flag=0的物件(T2)執行緒啟動,先鎖定O2,睡眠500毫秒,等待T1釋放O1;
* T1睡眠結束後需要鎖定O2才能繼續執行,而此時O2已被T2鎖定;
* T2睡眠結束後需要鎖定O1才能繼續執行,而此時O1已被T1鎖定;
* T1、T2相互等待,都需要對方鎖定的資源才能繼續執行,從而死鎖。
*/
class DeadLock 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 (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}

public static void main(String[] args) {
DeadLock td1 = new DeadLock();
DeadLock td2 = new DeadLock();
td1.flag = 1;
td2.flag = 0;
new Thread(td1).start();
new Thread(td2).start();

}
}
[/code]