首頁 > Java > java教程 > 主體

我們如何避免在Java中發生死鎖?

WBOY
發布: 2023-08-20 18:13:06
轉載
684 人瀏覽過

我們如何避免在Java中發生死鎖?

在Java中,死鎖是一種程式設計情況,其中兩個或多個執行緒被永久阻塞。死鎖條件至少會發生在兩個執行緒兩個或多個資源之間。

如何避免死鎖

  • 避免巢狀鎖定:死鎖主要發生在提供多個執行緒鎖定時。如果我們已經給一個執行緒提供了鎖,就避免給其他執行緒提供鎖。
  • 避免不必要的鎖定:我們只需要給那些必要的成員提供鎖定。不必要地提供鎖可能導致死鎖。
  • 使用Thread.join():當一個執行緒在等待另一個執行緒完成時,會出現死鎖條件。如果發生這種情況,我們可以使用Thread.join(),並設定最長執行時間。

範例

public class DeadlockTest {
   public static void main(String[] args) throws InterruptedException {
      Object obj1 = new Object();
      Object obj2 = new Object();
      Object obj3 = new Object();
      Thread t1 = new Thread(new SyncThread(obj1, obj2), "t1");
      Thread t2 = new Thread(new SyncThread(obj2, obj3), "t2");
      t1.start();
      Thread.sleep(2000);
      t2.start();
      Thread.sleep(2000);
   }
}
class SyncThread implements Runnable {
   private Object obj1;
   private Object obj2;
   public SyncThread(Object o1, Object o2){
      this.obj1=o1;
      this.obj2=o2;
   }
   @Override
   public void run() {
      String name = Thread.currentThread().getName();
      System.out.println(name + " acquiring lock on " + obj1);
      <strong>synchronized (obj1)</strong> {
         System.out.println(name + " acquired lock on " + obj1);
         work();
      }
      System.out.println(name + " released lock on " + obj1);
      System.out.println(name + " acquiring lock on " + obj2);
      <strong>synchronized (obj2)</strong> {
         System.out.println(name + " acquired lock on " + obj2);
         work();
      }
      System.out.println(name + " released lock on " + obj2);
      System.out.println(name + " finished execution.");
   }
   private void work() {
      try {
         Thread.sleep(5000);
      } catch (InterruptedException ie) {
         ie.printStackTrace();
      }
   }
}
登入後複製

輸出

t1 acquiring lock on java.lang.Object@917d8d4
t1 acquired lock on java.lang.Object@917d8d4
t2 acquiring lock on java.lang.Object@5c4b42fb
t2 acquired lock on java.lang.Object@5c4b42fb
t1 released lock on java.lang.Object@917d8d4
t1 acquiring lock on java.lang.Object@5c4b42fb
t1 acquired lock on java.lang.Object@5c4b42fb
t2 released lock on java.lang.Object@5c4b42fb
t2 acquiring lock on java.lang.Object@528cb702
t2 acquired lock on java.lang.Object@528cb702
t1 released lock on java.lang.Object@5c4b42fb
t2 released lock on java.lang.Object@528cb702
t1 finished execution.
t2 finished execution.
登入後複製

以上是我們如何避免在Java中發生死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板