Rumah >Java >javaTutorial >Bagaimanakah kita boleh mengelakkan kebuntuan di Jawa?

Bagaimanakah kita boleh mengelakkan kebuntuan di Jawa?

WBOY
WBOYke hadapan
2023-08-20 18:13:06741semak imbas

Bagaimanakah kita boleh mengelakkan kebuntuan di Jawa?

Di Java, deadlock ialah situasi pengaturcaraan di mana dua atau lebih utas disekat secara kekal. Keadaan kebuntuan boleh berlaku sekurang-kurangnya antara dua utas dan dua atau lebih sumber.

Cara mengelakkan kebuntuan

  • Elakkan kunci bersarang: Kebuntuan berlaku terutamanya apabila kunci diberikan kepada berbilang benang. Jika kami telah menyediakan kunci pada satu utas, elakkan memberikan kunci kepada utas lain.
  • Elakkan kunci yang tidak diperlukan: Kami hanya perlu menyediakan kunci kepada ahli yang diperlukan. Menyediakan kunci secara tidak perlu boleh menyebabkan kebuntuan.
  • Menggunakan Thread.join(): Keadaan kebuntuan berlaku apabila satu thread sedang menunggu thread lain untuk dilengkapkan. Jika ini berlaku, kita boleh menggunakan Thread.join() dan menetapkan masa pelaksanaan maksimum.

Contoh

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();
      }
   }
}

Output

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.

Atas ialah kandungan terperinci Bagaimanakah kita boleh mengelakkan kebuntuan di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam