Java 重入锁异常

Java 重入锁异常,java,android,multithreading,Java,Android,Multithreading,我正在为Android2.2开发,对ReentrantLocks的工作原理有点困惑。下面的代码是否会引发IllegalMonitorStateException?我问这个问题是因为我不知道它是如何实现的——根据API,tryLock在且仅在成功获得锁的情况下返回true——但有时unlock()命令会这样做 public void lockDemo() { ReentrantLock myLock = new ReentrantLock(); if (myLock.tryLock

我正在为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();
    }
}

它实际上可能无法解决您的问题,但这里也有类似的讨论:
tryLock()
方法有两个参数,
long timeout,TimeUnit
。这可能与此有关

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

public void lockDemo() {
    ReentrantLock myLock = new ReentrantLock();
    try {
        myLock.lock();
        // do work...
    } catch (Exception e) {
        // catch if something fails
    } finally {
        myLock.unlock();
    }
}

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


在我的脑海里,我可以想象,也许锁实际上被解锁了两次。或者,在一些认为自己拥有锁的代码路径中,可能实际上无法成功获取锁

这个例子不应该失败。但是您的实际代码真的这么简单吗?是和否。整个程序相当大,大约有8个线程运行并共享信息。但是tryLock()块中的代码非常简单。我要么将原语复制到局部变量,以便以后进行操作,进行一些数学运算,要么将其写入printWriter。据我所知,没有任何东西会破坏ReentrantLock。谢谢链接。正如你所说,我认为解决方案不适用于我的代码,但至少现在我知道我没有发疯。还有一个tryLock()不接受参数——如果锁不可用,它会立即返回false。不过,我还没有看到很多使用它的官方代码示例。我同意您的评估,但我完全不知道我还可能编写哪些代码会导致这种情况发生。另外,如果另一个线程持有该锁,则该线程无法获得该锁;如果这个线程持有锁,它应该能够释放它。除非我遗漏了什么?是的,但可能已经发布了两次?也许它没锁就没锁了?这些情景。一分钟的调试器跟踪对该锁上的方法的调用应该会显示它。