我正在为Android 2.2开发,对ReentrantLocks的工作方式有些困惑。以下代码可以抛出IllegalMonitorStateException吗?我之所以问是因为我看不到它怎么做-根据API,tryLock仅在成功获得锁定后才返回true,但偶尔会执行unlock()命令。

public void lockDemo() {
    ReentrantLock myLock = new ReentrantLock();
    if (myLock.tryLock()) {
        System.out.println("Lock obtained");
        myLock.unlock();
    }
}

最佳答案

从javadoc中获取:如果当前线程不持有锁,则unlock()抛出IllegalMonitorStateException。我想除非您看到这个,否则您不会问,但是,您应该检查堆栈跟踪以查看是什么方法触发了它。您提供的示例不会重现这种情况,因此您的实际代码必须更复杂,并且问题必须出在其他地方。

在我的头顶上,我可以想象到锁实际上是被某种方式解锁了两次。或者认为在某些认为它们具有锁的代码路径中可能实际上未成功获取该锁。

07-28 04:37