1

当线程处于被锁定的关键部分时,我需要以某种方式停止线程 1 秒ReentrantLock

我的代码是:

public class Lock implements Runnable {
    private ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        try {
            lock.lock();
            System.out.println(Thread.currentThread().getName() + " is running !");
            lock.wait(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) {
        Lock lock = new Lock();
        Thread thread = new Thread(lock);

        thread.start();
    }
}

当我调用lock.wait(1000)run() 方法时,它会抛出IllegalMonitorStateException.

如果我通过lock.lock()方法获得监视器,为什么会出现此异常?

当我打电话super.wait(1000)而不是lock.wait(1000).

4

1 回答 1

0

在锁 b/c 内调用时出现异常,lock.wait(1000)您没有以正确的方式锁定对象。这是一回事。

synchronized(object) {
  object.wait(1000);
}

这很有效,因为您已object锁定 ' 的监视器。 ReentrantLock.lock()以不同的方式工作。一切都没有丢失!您可以使用Thread.sleep()LockSupport.parkNanos()让您的线程在关键部分内休眠。

如果您需要处理虚假唤醒,则需要一个循环。

long waitStart = System.nanoTime();
long waitTime = TimeUnit.SECONDS.toNanos(1);
do {
  LockSupport.parkNanos(waitTime);
  waitTime = waitTime - (System.nanoTime() - waitStart);
} while(waitTime > 0);

或上述的一些变化。

祝你好运。

于 2014-05-21T03:58:20.760 回答