>Java >java지도 시간 >Java에서 교착 상태를 어떻게 피할 수 있습니까?

Java에서 교착 상태를 어떻게 피할 수 있습니까?

WBOY
WBOY앞으로
2023-08-20 18:13:06723검색

Java에서 교착 상태를 어떻게 피할 수 있습니까?

Java에서 deadlock두 개 이상의 스레드가 영구적으로 차단되는 프로그래밍 상황입니다. 교착 상태 조건은 적어도 두 개의 스레드두 개 이상의 리소스 사이에서 발생할 수 있습니다.

교착 상태를 방지하는 방법

  • 중첩 잠금 방지: 교착 상태는 주로 여러 스레드에 잠금을 제공할 때 발생합니다. 이미 하나의 스레드에 잠금을 제공한 경우 다른 스레드에 잠금을 제공하지 마십시오.
  • 불필요한 잠금 방지: 필요한 구성원에게만 잠금을 제공하면 됩니다. 불필요하게 잠금을 제공하면 교착 상태가 발생할 수 있습니다.
  • 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으로 문의하시기 바랍니다. 삭제