2017-12-07 2 views
0

https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html에서 교착 상태를 만드는 방법을 이해하려고합니다.데드락 이해하기

샘플 코드를 복사하여 붙여 넣는 대신 직접 작성했습니다.

링크의 마지막 줄에는 "각 스레드가 다른 스레드가 활을 벗어날 때까지 기다리고 있기 때문에 어느 블록도 종료되지 않습니다"하지만 System.out.format에 대해서는 언급하지 않았습니다.

나는 다음 아래 코드를 작성하고 그것을

public class DeadlockTest { 
    static class Resource { 
    public synchronized void test1(Resource r) { 
     System.out.print("test1"); 
     r.test2(); 
    } 
    public synchronized void test2() { 
     System.out.print("test2"); 
    } 
    } 
    public static void main(String... a) { 
    final Resource r1 = new Resource(); 
    final Resource r2 = new Resource(); 
    new Thread(new Runnable() { 
     public void run() { 
     r1.test1(r2); 
     } 
    }).start(); 
    new Thread(new Runnable() { 
     public void run() { 
     r2.test1(r1); 
     } 
    }).start(); 
    } 
} 

그래서 내가 라인으로 라인을 비교하는 시도 만 인쇄 문이 잘못된 것을 발견 교착 상태를 입력하지 않습니다. System.out.format을 사용하는 대신 System.out.print를 사용했습니다. 그래서 코드는 결코 죽은 자물쇠 상황에 빠지지 않았습니다. 그런 다음 System.out.format으로 변경하고 데드 록을 시뮬레이트 할 수있었습니다.

필자는 링크에서 예제 코드를 복사하고 format 문을 print/println으로 변경했으며 교착 상태로 들어 가지 않았습니다.

누구나 정확히 교착 상태를 만드는 방법을 설명해주십시오.

+1

https://stackoverflow.com/questions/12450547/how-can-system-out-format-prevent-a-deadlock ... 비슷한 질문이 도움이 될 수 있습니다. – hamena314

답변

2

코드를 테스트 해 보았습니다. 그것은 정말로 잘 달렸다.

또는 String.formattest1에 추가했을 때만 차단되었습니다. 귀하의 "직장"방법 (print)이 너무 빠름처럼 보입니다. 두 번째 스레드가 test1을 호출하여 블록을 일으킬 수 있으려면 첫 번째 스레드가 이미 test2으로 끝났습니다. "동시에 서로 에서 나비"당신의 스레드가 실제로하지 않았다,하지만 "매우 빠르게 서로 후"

는 튜토리얼 예제를 유지합니다. 활을 좀 더 느리게하고,가 동시에 휘었을 때 기회가 증가합니다 (시스템이 두 번째 스레드를 예약하는 데 더 많은 시간이 걸리는 경우).