java - java中的monitor什么时候释放

标签 java concurrency

如果我有代码:

ReentrantLock lock = new ReentrantLock();
Condition waiting = lock.newCondition();

主题 1:

    value = default;
    lock.lock();
    try {
        waiting.await(new Long(timeout).longValue(), TimeUnit.SECONDS);
    } catch (InterruptedException e) {

        } finally {
            lock.unlock();
        }

主题 2:

  lock.lock();
  //set value
  waiting.signalAll();
  lock.unlock();    

我是否正确,当调用await时,锁上的监视器被释放,允许事件驱动线程2在需要时运行?如果线程 2 恰好运行,那么线程 1 何时能够通过 signalAll() 或 lock.unlock() 恢复?如果线程 2 发出唤醒信号,但仍然有锁,那是如何工作的?

最佳答案

实际上,调用 await 时会释放锁。当调用 signalAll 时,在信号线程 unlocks

之前,等待线程不会被唤醒

但是,区分 Java 对象监视器和 Java 锁很重要。它们是单独的构造,事实上,ReentrantLock/Condition 本身可以是与您正在使用的上下文不同的上下文中的监视器(例如,如果您调用 wait 而不是 await )你会得到明显的 IllegalMonitorStateException)。

关于java - java中的monitor什么时候释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9944330/

相关文章:

java - 解密用RSA java加密的 “long”消息

java - 在 Java 中有效压缩 10-1000 个字符的字符串?

sql-server - MS SQL Server - 安全并发使用全局临时表?

java - 如何使用单 Spark 上下文在 Apache Spark 中运行并发作业(操作)

JasperReports 中的 java.util.ConcurrentModificationException

java - SEVERE : Could not contact localhost:8005. Tomcat 在关闭时可能没有运行错误

java - 使用 Guava 的 EventBus,可以在创建总线的线程上运行订阅者代码吗?

java - 嵌套@RestController(内部类)-有副作用吗?

api - 如何在REST API中限制客户端

java - Infinispan 并发 DefaultCacheManager