Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

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


자바에서는 교착 상태 두 개 이상의 스레드가 영구적으로 차단되는 프로그래밍 상황입니다. . 최소 2개의 스레드에서 교착 상태가 발생합니다. 및 2개 이상의 리소스 .

교착 상태를 피하는 방법

  • 중첩 잠금 방지 :교착 상태는 주로 여러 스레드에 잠금을 부여할 때 발생합니다. 이미 여러 스레드에 잠금을 부여한 경우 잠금을 제공하지 마십시오.
  • 불필요한 잠금 방지 :꼭 필요한 멤버들만 락을 걸 수 있습니다. 불필요하게 잠금을 설정하면 교착 상태가 발생할 수 있습니다.
  • Thread.join() 사용: 한 스레드가 다른 스레드가 완료되기를 기다리고 있을 때 교착 상태가 나타납니다. 이 조건이 발생하면 Thread.join()을 사용할 수 있습니다. 실행에 걸리는 최대 시간입니다.

public class DeadlockTest { public static void main(String[] args) throws InterruptedException { Object obj1 =new Object(); 개체 obj2 =새 개체(); 개체 obj3 =새 개체(); 스레드 t1 =새로운 스레드(새로운 SyncThread(obj1, obj2), "t1"); 스레드 t2 =새로운 스레드(새로운 SyncThread(obj2, obj3), "t2"); t1.start(); Thread.sleep(2000); t2.start(); Thread.sleep(2000); }} 클래스 SyncThread는 Runnable을 구현합니다. { private Object obj1; 개인 개체 obj2; 공개 SyncThread(오브젝트 o1, 오브젝트 o2){ this.obj1=o1; this.obj2=o2; } @Override public void run() { 문자열 이름 =Thread.currentThread().getName(); System.out.println(name + " 잠금 획득 " + obj1); 동기화됨(obj1) { System.out.println(name + " " + obj1에 대한 잠금 획득); 일하다(); } System.out.println(name + " 잠금 해제 " + obj1); System.out.println(name + " 잠금 획득 " + obj2); 동기화됨(obj2) { System.out.println(name + " " + obj2에 대한 잠금 획득); 일하다(); } System.out.println(name + " 잠금 해제 " + obj2); System.out.println(이름 + " 실행이 완료되었습니다."); } 개인 무효 작업() { { Thread.sleep(5000) 시도; } catch(InterruptedException 즉) { ie.printStackTrace(); } }}

출력

t1이 java.lang.Object@917d8d4t1에 대한 잠금을 획득했습니다. java.lang.Object@5c4b42fbt2에 대한 잠금이 획득되었습니다. java.lang.Object@5c4b42fbt1에 대한 잠금이 해제되었습니다. java.lang에 대한 잠금이 해제되었습니다. .Object@917d8d4t1이 java.lang.Object@5c4b42fbt1에 대한 잠금을 획득했습니다. java.lang.Object@5c4b42fbt2에 대한 잠금이 해제되었습니다. java.lang.Object@5c4b42fbt2에 대한 잠금이 해제되었습니다. .Object@528cb702t1이 java.lang.Object@5c4b42fbt2에서 잠금을 해제했습니다. java.lang.Object@528cb702t1에서 잠금을 해제했습니다.