首页 > 解决方案 > 为什么要在释放操作中获取锁

问题描述

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

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?如果我刚刚获得了对资源的访问权限,为什么要释放我对它的锁定?

标签: javamultithreadinglocking

解决方案


基本上,您使用 a Lock、布尔标志和条件变量来实现等效的 a Lock。您认为它完全是多余的是正确的。我认为你的教授只是给你一个练习来展示等待条件的正确方法,以及发出信号的正确方法。想出等待的理由和发出信号的理由可能会更有创意,但无论如何。重要的是这些和功能所体现的模式。acquire()release()

请注意,这并不是一个真正如何在操作系统级别实现锁的示例,因为它缺少等待集的概念。也就是说,等待获取任何给定锁的线程集、等待被condition.signal()调用唤醒的线程集、等待 CPU 运行的线程集等。


推荐阅读