【问题标题】:Condition - should unlock before await?条件 - 应该在等待之前解锁吗?
【发布时间】:2012-07-03 10:14:19
【问题描述】:

你能告诉我是否应该在等待条件之前释放锁吗?

try {
    lock.lock();
    while (isNotEmpty()) {
        condition.await();
    }
} finally {
    lock.unlock();
}

或者

try {
    lock.lock();
    while (isNotEmpty()) {
        lock.unlock();
        condition.await();
    }
} finally {
    lock.unlock();
}

【问题讨论】:

  • 你读过the javadoc吗?
  • acquire(); try { use(); } finally { release(); }。如果您的获取 (lock) 失败,那么您将释放您从未持有的资源。在这种情况下,您可以解锁 [reentrant] 锁的封闭锁。

标签: java multithreading concurrency


【解决方案1】:

不,您不需要在调用await 之前显式释放锁,await 会自动释放它。来自javadoc

与此条件关联的锁被原子释放,并且 当前线程因线程调度目的而被禁用[...]

还有:

当调用此方法时,假定当前线程持有与此Condition 关联的锁。

【讨论】:

    【解决方案2】:

    只有当你锁定()关联的Lock时,你才能在Conditionawait()

    你为什么不给 isEmpty 一个条件,让你的条件更清楚。

    请参阅 Javadoc 中的示例。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html

    例如

     lock.lock();
     try {
       while (count > 0)
         isEmpty.await();
       // do something when empty.
     } finally {
       lock.unlock();
     }
    

    【讨论】:

    • “你不能在锁上等待,你没有锁。”大概lock是与condition关联的锁。
    【解决方案3】:

    wait 和 notify 必须从 synchronized 块中的 with 调用,所以 同样的规则适用于 await 和 signal。虽然 await 自动释放,但如果你这样做应该在 lock() 和 unlock() 之间

    lock.lock()          // start of synchronized block
    
    condition.await()
    
    lock.unlock()        // end of synchronized block
    

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2011-11-29
      • 2011-08-17
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2019-02-24
      • 2014-04-20
      相关资源
      最近更新 更多