在创建监视器来管理对单个资源的访问时,我的教授给了我们以下代码:
private final Lock monitor;
private final Condition nonBusy;
private boolean busy;
// acquire resource
public void acquire() throws InterruptedException {
monitor.lock();
try {
while(busy)
nonBusy.await();
busy = true;
} finally {
monitor.unlock();
}
}
// release the previously acquired resource
public void release() {
monitor.lock();
try {
busy = false;
nonBusy.signal();
} finally {
monitor.unlock();
}
}
为什么在acquire
操作结束时解锁,而在release操作
开始时锁定?
如果我刚刚获得了对该资源的访问权限,为什么要释放它的锁?
最佳答案
基本上,您使用Lock
、 boolean 标志和条件变量来实现Lock
的等效项。您认为它完全是多余的,这是正确的。我认为你的教授只是给你一个练习,展示等待条件的正确方法,以及发出信号的正确方法。本来可以更有创意一点,提出等待的理由和发出信号的理由,但无论如何。重要的是这些 acquire()
和 release()
函数所体现的模式。
请注意,它不是在操作系统级别真正实现锁的示例,因为它缺少等待集的概念。也就是说,正在等待获取任何给定锁的线程集、正在等待被 condition.signal()
调用唤醒的线程集、正在等待的线程集运行的CPU等。
关于java - 为什么要在释放操作中获取锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61277113/