2012-04-25 6 views
0

CyclicBarrier와 CountDownLatch의 차이점은 무엇입니까? 나는 thnik 거기 둘 다 동일하게 보이는 것처럼 미묘한 차이가 있습니다.CyclicBarrier 및 CountDownLatch?

내가 잘못하면 알려 주시고 똑같이 설명해주십시오.

+0

가능한 복제본 [Java 동시성 : 카운트 다운 래치와 순환 장벽] (http://stackoverflow.com/questions/4168772/java-concurrency-countdown-latch-vs-cyclic-barrier) – Simon

답변

1

CountDownLatch는 일회성 동기화에 사용됩니다. CountDownLatch를 사용하는 동안 모든 스레드는 원하는만큼 countDown()을 호출 할 수 있습니다. await()를 호출 한 스레드는 차단되지 않은 다른 스레드가 countDown()을 호출하여 카운트가 0이 될 때까지 차단됩니다. javadoc for CountDownLatch 상태 :

현재 카운트가 0으로 인해 모든 대기중인 스레드 이 해제 된 후 카운트() 메소드의 호출 즉시 기다리고 복귀 의 후속 호출 될 때까지 방법이 블록 기다린다. ...

다른 전형적인 사용은 그 부분 카운트 다운 래치 실행의 Runnable 각 부분을 설명 N 부품에 문제가 분할 및 실행기 모두보다 Runnable을 대기하는 것이다. 모든 하위 부품이 완료되면 조정 스레드가 을 기다릴 수 있습니다. (스레드 반복 이 방법을 계산해야하는 경우, 대신으로 CyclicBarrier를 사용한다.)

한편, 환상 장벽 동기화 기능은 다수의 포인트, 예를 들어 사용되는 스레드 세트가 루프/단계별 계산을 실행 중이며 다음 반복/위상을 시작하기 전에 동기화해야하는 경우 javadoc for CyclicBarrier에 따라 다음 대기하는 스레드가 해제 된 후가 다시 사용할 수 있기 때문에

장벽은 순환이라고합니다.

CountDownLatch와 달리 await()에 대한 각 호출은 일부 단계에 속하므로 해당 단계에 속한 모든 당사자가 await()를 호출 할 때까지 스레드가 차단 될 수 있습니다. CyclicBarrier가 지원하는 명시적인 countDown() 연산은 없습니다.