【发布时间】:2017-02-10 08:42:38
【问题描述】:
我正在尝试运行以下代码:
在我的构造函数中,我初始化了我的原子布尔值:
Atomic Boolean isChannelActive = new AtomicBoolean(false);
在我的写方法中,我检查这个布尔值并等待:
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()
所以在这种情况下,我的原子布尔值将为真,我错过了 notifyAll() 事件,并且由于上下文切换将永远等待。
我怎样才能防止这个问题?
我知道同步块可能是一种选择,但我正在为这种情况寻找更优雅的选择。
【问题讨论】:
-
如果您正在调用
wait(),您已经在synchronized块中。 -
Conditions 可以替代吗?
-
我还看了一下 CountdownLatch 机制,并且工作正常。 CountdownLatches 可以解决同样的问题
标签: java multithreading synchronization atomic context-switch