2013-12-18 6 views
0

을 떠난 후 상태를 재설정 :자바 동시성 나는 다음과 같은 문제에 대한 해결책을 알아 내려고 노력하고 있어요 방법

public void signal(){ 
    //resets condition and signals threads blocked below 
} 

public void getValue(){ 

    waitOnCondition(); //block if a condition is not met. When signalled, all threads should proceed and get the value 

    //get value 

    resetCondition(); //reset condition, so that the next thread that executes this method blocks on the method above 

} 

내가 직면하고 문제는 간단한 것 같다,하지만 난 방법을 모두 볼 수 고군분투 가장자리의 경우를 캡처 할 수 있습니다.

하나의 해결책은 예를 들어, 플래그가 true로 설정 될 때까지 await로가는 다음 Condition의, waitOnCondition에 witing 모든 스레드와 Lock의를 사용하고 진행 될 수 있습니다. signal()을 실행하는 스레드는 동일한 잠금을 사용하고 플래그를 true로 설정하고 signal을 설정합니다. 그런 다음, 해제 된 스레드는 잠금을 다시 획득하여 조건을 false로 설정합니다. 그러나 이것은 모든 스레드가 getValue 지점에 도달 할 것이라고 보장하지는 않습니다. 예를 들면 다음과 같습니다.

스레드 1과 2가 대기 중입니다. 신호를받습니다. 신호를 받고 나면, 쓰레드 1은 잠금을 다시 획득하고, 이제는 사실을 확인하고 진행한다. 값을 얻고 잠금을 획득하고 조건을 거짓으로 설정합니다. 스레드 2는 이제 조건을 여전히 거짓으로보고 차단합니다.

또 다른 해결책은 매우 깔끔하고 우아하며 CountDownLatch을 사용하는 것입니다. 이렇게하면 모든 스레드가 계속 진행됩니다. 그러나 이것은 재설정 할 수 없습니다. 다른 아이디어 나 의견이 있으십니까?

+0

http://stackoverflow.com/questions/20635844/java-multithreading-awaiting-condition-and-releasing-all-threads – assylias

답변

2

CyclicBarrier과 같은 모양입니다. 재설정 가능하며 모든 당사자가있을 때 장벽 조치를 트리거 할 수도 있습니다.

고급 버전 인 Phaser도 있고 CyclicBarrier이며 JDK 7이 필요합니다.