我是为Android2.2开发的,对ReentrantLocks的工作原理有点困惑。下面的代码会抛出IllegalMonitorStateException吗?我之所以这样问,是因为我不明白它是如何做到的--根据API的说法,当且仅当成功获得锁时,tryLock才会返回true --但有时unlock()命令会这样做。
public void lockDemo() {
ReentrantLock myLock = new ReentrantLock();
if (myLock.tryLock()) {
System.out.println("Lock obtained");
myLock.unlock();
}
}发布于 2010-07-10 18:13:51
在javadoc中:如果当前线程不持有锁,则unlock()抛出IllegalMonitorStateException。我猜你不会问,除非你看到这个,但是,你应该检查堆栈跟踪,看看是什么方法触发它。您给出的示例不会重现这种情况,因此您的实际代码一定会更加复杂,问题一定出在其他地方。
在我的脑海中,我可以想象也许这个锁实际上被解锁了两次。或者在某些认为拥有该锁的代码路径中实际上可能没有成功地获取该锁。
发布于 2010-07-09 22:13:41
它可能不会真正解决您的问题,但这里有一些类似的讨论:http://www.jroller.com/ethdsy/entry/reentrantlock_bug
发布于 2010-07-09 22:20:40
tryLock()方法有两个参数,long timeout, TimeUnit unit。这可能与此有关。
我并不是说使用锁的方式是错误的,我只是从来没有这样使用过。我被教导以这种方式使用锁:
public void lockDemo() {
ReentrantLock myLock = new ReentrantLock();
try {
myLock.lock();
// do work...
} catch (Exception e) {
// catch if something fails
} finally {
myLock.unlock();
}
}https://stackoverflow.com/questions/3213360
复制相似问题