2012-06-13 3 views
1

CountDownLatch를 사용하여 the advice I found in this post을 추적했는데 문제가 있습니다. 내가이 테스트를 작성하고 그것을 실행하고 내 스레드가 내가 자물쇠에 동기화하려고하면 블록을 만들었습니다.Countdown을 시도 할 때 동기화가 차단되는 이유

private CountDownLatch lock = new CountDownLatch(1); 

    @Test 
    public void testBlock() { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
     try 
     { 
      synchronized(this) { 
      this.wait(50); 
      } 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
      throw (new RuntimeException(e)); 
     } 
     releaseLock(); 
     } 
    }; 

    Thread t = new Thread(r); 
    t.setDaemon(true); 
    t.start(); 

    waitOnCallback(); 
    } 

    private void releaseLock() { 
    synchronized(lock) { // Thread t blocks here 
     lock.countDown(); 
    } 
    } 

    private void waitOnCallback() { 
    synchronized(lock) { 
     try 
     { 
     lock.await(); 
     } 
     catch (InterruptedException e) 
     { 
     throw new RuntimeException(e); 
     } 
    } 
    } 

왜이 기능이 작동하지 않습니까?

답변

2

CountDownLatch는 동기화가 필요한 (즉, synchronized(lock) 블록을 제거해야하는) 개체가 아닙니다. 모든 스레드 안전은 객체 자체에 내부적으로 처리됩니다.

+0

굉장! 무리 감사. – Ring

+0

@ 링 - 네. 불행히도 그 예제는 좋지 않습니다. – jtahlborn