如果我有代码:
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 发出唤醒信号,但仍然有锁,那是如何工作的?
最佳答案
实际上,调用 await
时会释放锁。当调用 signalAll
时,在信号线程 unlock
s
但是,区分 Java 对象监视器和 Java 锁很重要。它们是单独的构造,事实上,ReentrantLock/Condition 本身可以是与您正在使用的上下文不同的上下文中的监视器(例如,如果您调用 wait
而不是 await
)你会得到明显的 IllegalMonitorStateException)。
关于java - java中的monitor什么时候释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944330/