什么时候在java中发布监视器

时间:2012-03-30 13:52:20

标签: 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发出唤醒信号但仍有锁定,那该怎么办?

1 个答案:

答案 0 :(得分:3)

实际上,在调用await时会释放锁定。调用signalAll时,在信令线程unlock s

之前,没有等待的线程会唤醒

但是,使用Java Lock区分Java对象监视器非常重要。它们是单独的构造,实际上ReentrantLock / Condition本身可以是一个不同的上下文中的监视器,然后你正在使用它(例如,如果你调用await代替wait,你会得到明显的IllegalMonitorStateException )。