程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 線程死鎖問題,線程死鎖

線程死鎖問題,線程死鎖

編輯:JAVA綜合教程

線程死鎖問題,線程死鎖


一、定義

  線程死鎖是指由於兩個或者多個線程互相持有對方所需要的資源,導致這些線程處於等待狀態,無法前往執行。當線程進入對象的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都處於等待狀態,誰也無法繼續運行,即產生了死鎖。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved