【问题标题】:Why acquire a lock in a release operation为什么要在释放操作中获取锁
【发布时间】:2020-07-31 06:41:24
【问题描述】:

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

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

【问题讨论】:

  • 你认为这里的资源是什么?为什么?
  • 未指定。我认为 monitor.lock() 和 monitor.unlock() 会在那里,即使资源类型发生了变化。还是我错了?
  • 让我换个说法:关键部分是什么?
  • try 块内的代码
  • 如果你去掉所有的锁定机制,它就是busy。所以你获得了对资源的访问权,你使用了它,现在你已经完成了它,所以你释放了访问权。

标签: java multithreading locking


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    相关资源
    最近更新 更多