如果我有代码:
ReentrantLock lock = new ReentrantLock();
Condition waiting = lock.newCondition();
主题1:
value = default;
lock.lock();
try {
waiting.await(new Long(timeout).longValue(), TimeUnit.SECONDS);
} catch (InterruptedException e) {
} finally {
lock.unlock();
}
主题2:
lock.lock();
//set value
waiting.signalAll();
lock.unlock();
我是否正确,当调用await时,锁上的监视器被释放,允许事件驱动的线程2在需要时运行?如果线程2碰巧运行,什么时候线程1能够恢复,signalAll()或lock.unlock()?如果线程2发出唤醒信号但仍有锁定,那该怎么办?
答案 0 :(得分:3)
实际上,在调用await
时会释放锁定。调用signalAll
时,在信令线程unlock
s
但是,使用Java Lock区分Java对象监视器非常重要。它们是单独的构造,实际上ReentrantLock / Condition本身可以是一个不同的上下文中的监视器,然后你正在使用它(例如,如果你调用await
代替wait
,你会得到明显的IllegalMonitorStateException )。