首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReentrantLock异常

ReentrantLock异常
EN

Stack Overflow用户
提问于 2010-07-09 22:06:09
回答 3查看 2.2K关注 0票数 2

我是为Android2.2开发的,对ReentrantLocks的工作原理有点困惑。下面的代码会抛出IllegalMonitorStateException吗?我之所以这样问,是因为我不明白它是如何做到的--根据API的说法,当且仅当成功获得锁时,tryLock才会返回true --但有时unlock()命令会这样做。

代码语言:javascript
复制
public void lockDemo() {
    ReentrantLock myLock = new ReentrantLock();
    if (myLock.tryLock()) {
        System.out.println("Lock obtained");
        myLock.unlock();
    }
}
EN

回答 3

Stack Overflow用户

发布于 2010-07-10 18:13:51

在javadoc中:如果当前线程不持有锁,则unlock()抛出IllegalMonitorStateException。我猜你不会问,除非你看到这个,但是,你应该检查堆栈跟踪,看看是什么方法触发它。您给出的示例不会重现这种情况,因此您的实际代码一定会更加复杂,问题一定出在其他地方。

在我的脑海中,我可以想象也许这个锁实际上被解锁了两次。或者在某些认为拥有该锁的代码路径中实际上可能没有成功地获取该锁。

票数 1
EN

Stack Overflow用户

发布于 2010-07-09 22:13:41

它可能不会真正解决您的问题,但这里有一些类似的讨论:http://www.jroller.com/ethdsy/entry/reentrantlock_bug

票数 0
EN

Stack Overflow用户

发布于 2010-07-09 22:20:40

tryLock()方法有两个参数,long timeout, TimeUnit unit。这可能与此有关。

我并不是说使用锁的方式是错误的,我只是从来没有这样使用过。我被教导以这种方式使用锁:

代码语言:javascript
复制
public void lockDemo() {
    ReentrantLock myLock = new ReentrantLock();
    try {
        myLock.lock();
        // do work...
    } catch (Exception e) {
        // catch if something fails
    } finally {
        myLock.unlock();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3213360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档