Computer >> Máy Tính >  >> Lập trình >> Java

Làm thế nào chúng ta có thể tránh bế tắc trong Java?


Trong Java, một bế tắc là một tình huống lập trình trong đó hai hoặc nhiều chuỗi bị chặn vĩnh viễn . Điều kiện bế tắc sẽ xảy ra với ít nhất hai chuỗi hai hoặc nhiều tài nguyên .

Cách Tránh bế tắc

  • Tránh các ổ khóa lồng nhau :Bế tắc chủ yếu xảy ra khi chúng ta cung cấp khóa cho nhiều luồng. Tránh đưa ra một khóa cho nhiều chủ đề nếu chúng tôi đã cấp cho một chủ đề.
  • Tránh các ổ khóa không cần thiết :Chúng tôi có thể có một khóa chỉ những thành viên được yêu cầu. Việc có một khóa không cần thiết có thể dẫn đến bế tắc.
  • Sử dụng Thread.join (): Điều kiện deadlock xuất hiện khi một luồng đang đợi luồng khác kết thúc. Nếu điều kiện này xảy ra, chúng tôi có thể sử dụng Thread.join () với thời gian tối đa để thực thi.

Ví dụ

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);
      synchronized (obj1) {
         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);
      synchronized (obj2) {
         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();
      }
   }
}

Đầu ra

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.