:이 부울을 확인하고 대기 내 쓰기 방법원자 부울 사용은 나는 다음과 같은 코드를 실행하려고
Atomic Boolean isChannelActive = new AtomicBoolean(false);
: 내 생성자에서
내가 내 원자 부울 initalize
public ChannelFuture write(ByteBuf msgBuf) {
if (!isChannelActive.get()) {
try {
wait();
} catch (InterruptedException ex) {
logger.Error("Waiting interrupted", ex);
}
}
그러나 프로그램에있을 때 문제는이 원자 부울은 시간에 다른 스레드에서 설정 될 수있다 :
if (!isChannelActive.get()) {
try{ --- Right on here and program made a context switch at this time.
wait()
이 시나리오에서는 내 부울 값이 true이고 notifyAll() 이벤트가 누락되어 컨텍스트 전환으로 인해 영원히 대기합니다.
이 문제를 어떻게 방지 할 수 있습니까?
나는 동기화 된 블록이 옵션 일 수 있지만이 경우에는 좀 더 우아한 옵션을 찾고 있음을 알고 있습니다.
'대기()'를 호출하는 경우 이미 ** 동기화 된 상태입니다 **. – Kayaman
[조건] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html)이 대안이 될 수 있습니까? – Fildor
또한 CountdownLatch 메커니즘을 다시 한 번 살펴보고 잘 작동합니다. [CountdownLatches] (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html)에서 동일한 문제가 발생할 수 있습니다. –