logo

자바의 교착상태

Java의 교착 상태는 멀티스레딩의 일부입니다. 한 스레드가 다른 스레드가 획득한 개체 잠금을 기다리고 있고 두 번째 스레드가 첫 번째 스레드가 획득한 개체 잠금을 기다리는 상황에서 교착 상태가 발생할 수 있습니다. 두 스레드가 서로 잠금을 해제하기를 기다리고 있으므로 이 상태를 교착 상태라고 합니다.

자바의 교착상태

Java의 교착 상태 예

테스트교착상태Example1.java

배열 슬라이싱 자바
 public class TestDeadlockExample1 { public static void main(String[] args) { final String resource1 = 'ratan jaiswal'; final String resource2 = 'vimal jaiswal'; // t1 tries to lock resource1 then resource2 Thread t1 = new Thread() { public void run() { synchronized (resource1) { System.out.println('Thread 1: locked resource 1'); try { Thread.sleep(100);} catch (Exception e) {} synchronized (resource2) { System.out.println('Thread 1: locked resource 2'); } } } }; // t2 tries to lock resource2 then resource1 Thread t2 = new Thread() { public void run() { synchronized (resource2) { System.out.println('Thread 2: locked resource 2'); try { Thread.sleep(100);} catch (Exception e) {} synchronized (resource1) { System.out.println('Thread 2: locked resource 1'); } } } }; t1.start(); t2.start(); } } 

산출:

 Thread 1: locked resource 1 Thread 2: locked resource 2 

더 복잡한 교착 상태

교착 상태에는 두 개 이상의 스레드가 포함될 수도 있습니다. 그 이유는 교착 상태를 감지하기 어려울 수 있기 때문입니다. 다음은 4개의 스레드가 교착 상태에 빠진 예입니다.

스레드 1은 A를 잠그고 B를 기다립니다.

스레드 2는 B를 잠그고 C를 기다립니다.

스레드 3은 C를 잠그고 D를 기다립니다.

Java 구문 분석 문자열을 int로

스레드 4는 D를 잠그고 A를 기다립니다.

스레드 1은 스레드 2를 기다리고, 스레드 2는 스레드 3을 기다리고, 스레드 3은 스레드 4를 기다리고, 스레드 4는 스레드 1을 기다립니다.

bash 환경 변수가 설정되어 있는지 확인

교착상태를 피하는 방법은 무엇입니까?

문제의 해결책은 문제의 뿌리에서 발견됩니다. 교착 상태에서는 리소스 A와 B에 액세스하는 패턴이 주요 문제입니다. 문제를 해결하려면 코드가 공유 리소스에 액세스하는 명령문의 순서를 변경하기만 하면 됩니다.

교착상태Solved.java

 public class DeadlockSolved { public static void main(String ar[]) { DeadlockSolved test = new DeadlockSolved(); final resource1 a = test.new resource1(); final resource2 b = test.new resource2(); // Thread-1 Runnable b1 = new Runnable() { public void run() { synchronized (b) { try { /* Adding delay so that both threads can start trying to lock resources */ Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } // Thread-1 have resource1 but need resource2 also synchronized (a) { System.out.println('In block 1'); } } } }; // Thread-2 Runnable b2 = new Runnable() { public void run() { synchronized (b) { // Thread-2 have resource2 but need resource1 also synchronized (a) { System.out.println('In block 2'); } } } }; new Thread(b1).start(); new Thread(b2).start(); } // resource1 private class resource1 { private int i = 10; public int getI() { return i; } public void setI(int i) { this.i = i; } } // resource2 private class resource2 { private int i = 20; public int getI() { return i; } public void setI(int i) { this.i = i; } } } 

산출:

 In block 1 In block 2 

위 코드에서 DeadlockSolved 클래스는 교착 상태 종류의 상황을 해결합니다. 이는 교착 상태를 방지하고 교착 상태가 발생한 경우 이를 해결하는 데 도움이 됩니다.

Java에서 교착 상태를 피하는 방법은 무엇입니까?

교착상태는 완전히 해결될 수 없습니다. 하지만 아래에 언급된 기본 규칙을 따르면 이를 방지할 수 있습니다.

    중첩된 잠금 방지: 여러 스레드에 잠금을 부여하는 것을 피해야 합니다. 이것이 교착 상태의 주요 원인입니다. 이는 일반적으로 여러 스레드에 잠금을 부여할 때 발생합니다.불필요한 잠금 방지: 중요한 스레드에 잠금을 부여해야 합니다. 교착 상태를 유발하는 불필요한 스레드에 잠금을 부여합니다.스레드 조인 사용: 교착 상태는 일반적으로 한 스레드가 다른 스레드가 완료되기를 기다릴 때 발생합니다. 이 경우 우리는 다음을 사용할 수 있습니다. 가입하다 스레드가 소요되는 최대 시간.