一、定義
線程死鎖是指由於兩個或者多個線程互相持有對方所需要的資源,導致這些線程處於等待狀態,無法前往執行。當線程進入對象的synchronized代碼塊時,便占有了資源,直到它退出該代碼塊或者調用wait方法,才釋放資源,在此期間,其他線程將不能進入該代碼塊。當線程互相持有對方所需要的資源時,會互相等待對方釋放資源,如果線程都不主動釋放所占有的資源,將產生死鎖。
二、實例
package book.thread.deadlock;
public class DeadLock {
public static void main(String[] args) {
//兩個資源
final Object resource1 = "resource1";
final Object resource2 = "resource2";
//第一個線程,想先占有resource1,再嘗試著占有resource2
Thread t1 = new Thread(){
public void run(){
//嘗試占有resource1
synchronized(resource1){
//成功占有resource1
System.out.println("Thread1 1:locked resource1");
//休眠一段時間
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//嘗試占有resource2,如果不能占有,該線程會一直等到
synchronized(resource2){
System.out.println("Thread1 1:locked resource2");
}
}
}
};
//第二個線程,想先占有resource2,再占有resource1
Thread t2 = new Thread(){
public void run(){
//嘗試占有resource2
synchronized(resource2){
//成功占有resource2
System.out.println("Thread 2 :locked resource2");
//休眠一段時間
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
//嘗試占有resource1,如果不能占有,該線程會一直等到
synchronized(resource1){
System.out.println("Thread1 2:locked resource1");
}
}
}
};
//啟動線程
t1.start();
t2.start();
}
}
輸出結果:
Thread 2 :locked resource2
Thread1 1:locked resource1
結果分析:
線程Thread1率先占有了resource1,繼續運行時需要resource2,但此時resource2卻被線程Thread2占有了,因此只能等待Thread2釋放resource2才能夠繼續運行;同時,Thread2也需要resource1,它只能等待Thread1釋放resource1才能夠繼續運行,因此,Thread1和Thread2都處於等待狀態,誰也無法繼續運行,即產生了死鎖。