1

IllegalMonitorStateException从块内解锁时,我的程序会抛出一个错误finally。Javadoc 说“如果当前线程没有持有这个锁”就会抛出这个异常。但是,如果程序曾经到达 finally 块,它之前一定已经获得了锁。锁之前没有在其他地方解锁。锁会“丢失”吗?

代码示例:

final ReadWriteLock rwLock = new ReentrantReadWriteLock();

public void doSomething() {
    Lock lock = rwLock.writeLock();
    try {
        doStuff();
    } finally {
        lock.unlock();
    }
}
4

1 回答 1

3

从 升级ReentrantLock到时会出现此问题,ReentrantReadWriteLock因为两个类的语义不同。此代码按预期工作:

final Lock lock = new ReentrantLock();

public void doSomething() {
    lock.lock();
    try {
        doStuff();
    } finally {
        lock.unlock();
    }
}

不同之处在于,lock.lock()[可选地等待然后]按预期获取当前线程的锁,但rwLock.writeLock()只返回实例的写锁部分ReentrantReadWriteLock并且不尝试锁定任何内容。至于这个例子,代码应该是这样的:

final ReadWriteLock rwLock = new ReentrantReadWriteLock();

public void doSomething() {
    rwLock.writeLock().lock();
    try {
        doStuff();
    } finally {
        rwLock.writeLock().unlock();
    }
}

getter 方法writeLock()——而且——readLock()每次都为同一个线程返回同一个锁,因此获得的锁不需要保存在变量中以便以后解锁,你可以简单地获取“一个新的”来解锁“旧的”,因为它们必须是相同的。(这是因为Thread.currentThread()是静态的。)

于 2013-07-24T07:02:00.007 回答