java - 为什么要在释放操作中获取锁
问题描述
在创建监视器以管理对单个资源的访问的上下文中,我的教授给了我们以下代码:
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
操作结束时解锁而在释放开始时锁定operation
?如果我刚刚获得了对资源的访问权限,为什么要释放我对它的锁定?
解决方案
基本上,您使用 a Lock
、布尔标志和条件变量来实现等效的 a Lock
。您认为它完全是多余的是正确的。我认为你的教授只是给你一个练习来展示等待条件的正确方法,以及发出信号的正确方法。想出等待的理由和发出信号的理由可能会更有创意,但无论如何。重要的是这些和功能所体现的模式。acquire()
release()
请注意,这并不是一个真正如何在操作系统级别实现锁的示例,因为它缺少等待集的概念。也就是说,等待获取任何给定锁的线程集、等待被condition.signal()
调用唤醒的线程集、等待 CPU 运行的线程集等。
推荐阅读
- asp.net - 可扩展的 ASP.NET Core 2 应用程序
- ios - 带有属性字符串的 UIPickerView
- google-distancematrix-api - 在 VBA 中接收来自 Google-DistanceMatrix api 的“Invalid_Request”响应
- javascript - 角度 5:从不工作的对象设置(点击)值
- python - 为什么 pyenv 声明一个版本没有安装,尽管它确实存在?
- google-cloud-pubsub - 在 Google Pubsub 上优先发送消息
- ios - isIdleTimerDisabled 在 iOS 12 中不起作用
- javascript - 在 Node.js 中将 64 位有符号整数转换为 16 字节缓冲区
- node.js - 如何判断 XML 解析器是否已完成文件解析?
- node.js - 为什么并发 lambda 请求延迟启动?