java - 为什么要在释放操作中获取锁

标签 java multithreading locking

在创建监视器来管理对单个资源的访问时,我的教授给了我们以下代码:

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/

相关文章:

Java:堆栈溢出错误

c# - 当我们需要重入支持时,异步函数的互斥体替代方案

c# - 在已经拆分的上下文上调用 await 时是否有开销?

php - 是否可以同时运行 3 行代码?

c# - 如何使用多个线程管理从集合中添加和删除特定项目?

java - 在android中将16位音频存储在8位字节数组上

Java/Android 如何从 html 响应中获取 JSON?

linux - Jboss 4.2.0部署失败

java - 扩展抽象类时出错

c# - 使用 lock 语句在 C# 中递归/嵌套锁定