死鎖是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
public class ShareObject1 {}
public class ShareObject2 {}
public class Thread1 extends Thread {
@Override
public void run() {
synchronized (ShareObject1.class) {
System.out.println("線程1獲取到 ShareObject1 的鎖");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ShareObject2.class) {
System.out.println("線程1獲取到 ShareObject2 的鎖");
}
}
}
}
public class Thread2 extends Thread {
@Override
public void run() {
synchronized (ShareObject2.class) {
System.out.println("線程2獲取到 ShareObject2 的鎖");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ShareObject1.class) {
System.out.println("線程2獲取到 ShareObject1 的鎖");
}
}
}
}
public class Test {
public static void main(String[] args) {
new Thread1().start();
new Thread2().start();
}
}
運行main得到如下結果:
在上述代碼中,線程Thread1首先獲取到ShareObjectl的鎖,然後再去嘗試獲取ShareObject2的鎖:此時線程Thread2已經獲取到ShareObject2的鎖,繼續嘗試去獲取ShareObject1的鎖。這樣兩個線程都需要得到對方已經佔有的資源後才能繼續運行,因此,會導致死鎖。造成死鎖的主要原因是兩個線程請求資源的順序不合理,如果這兩個線程採用同樣的順序獲取,那麼就不會出現死鎖。
參考文獻:《Java程序員面試筆試真題與解析》