AbstractQueuedSynchronizer를 사용하는 간단한 클래스를 작성했습니다. "게이트"를 나타내는 클래스를 작성했습니다.이 클래스는 열려 있으면 통과 할 수 있고 닫히면 블로킹합니다. 여기에 코드입니다 : 패스 방법에 스레드 블록이 게이트를 폐쇄하고 다른 스레드가 그 동안 문을 열고 있기 때문에 경우AbstractQueuedSynchronizer.acquireShared는 대기 상태가 변경되었다하더라도 무한히 대기합니다.
public class GateBlocking {
final class Sync extends AbstractQueuedSynchronizer {
public Sync() {
setState(0);
}
@Override
protected int tryAcquireShared(int ignored) {
return getState() == 1 ? 1 : -1;
}
public void reset(int newState) {
setState(newState);
}
};
private Sync sync = new Sync();
public void open() {
sync.reset(1);
}
public void close() {
sync.reset(0);
}
public void pass() throws InterruptedException {
sync.acquireShared(1);
}
};
불행하게도, 차단 된 사람이 중단되지 않습니다 - 그것은 블록 무한.
public class GateBlockingTest {
@Test
public void parallelPassClosedAndOpenGate() throws Exception{
final GateBlocking g = new GateBlocking();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
g.open();
} catch (InterruptedException e) {
}
}
});
t.start();
g.pass();
}
}
이 도와주세요, 내가 게이트 통과 스레드가 성공적으로 잠금을 획득하도록 변경해야하는지 : 은 여기를 표시하는 테스트입니다.
귀하의 구현이 AbstractQueuedSynchronizer의 자바 문서에서 제공 BooleanLatch,과 매우 유사하여
protected try*()
방법에 잠금 정책을 정의, 당신이 동기화를 호출 할 필요가 가정합니다. 게이트를 열면 releaseShared (1) – hoaz