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

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

WBOY
풀어 주다: 2023-08-20 18:13:06
앞으로
728명이 탐색했습니다.

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿