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

Bagaimanakah kita boleh mengelakkan kebuntuan di Jawa?

WBOY
Lepaskan: 2023-08-20 18:13:06
ke hadapan
694 orang telah melayarinya

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();
      }
   }
}
Salin selepas log masuk

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.
Salin selepas log masuk

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

sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan