標籤:線程 死結
在實際編程中,要盡量避免死結情況的出現,但是有些面試中故意讓你寫一個死結的程式,這似乎也不太簡單(有些公司會出這樣的面試題),下面講解一個簡單的死結例子。
代碼說明:
第一步:當DeadLock的線程對象td1的屬性flag為1時,第一個線程先鎖定資源O1,睡眠500毫秒,然後嘗試鎖定資源O2(假如沒有被鎖定的話);
第二步:而第一個線程在睡眠的時候,第二個線程對象td2啟動了,其屬性flag為0,它首先鎖定資源O2,然後睡眠500毫秒,嘗試鎖定資源O1,但是此時第一個線程鎖定資源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();@Overridepublic 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();}}
【程式碼範例】 一個簡單的Java死結