ReentrantReadWriteLock丢失 - 抛出IllegalMonitorStateException

时间:2013-07-24 07:02:00

标签: java locking

IllegalMonitorStateException块内部解锁时,我的程序会抛出finally。 Javadoc说,如果当前线程没有持有此锁,则抛出此异常。但是,如果程序到达finally块,则必须先获得锁定。以前其他地方的锁没有解锁。锁可以“迷路”吗?

代码示例:

final ReadWriteLock rwLock = new ReentrantReadWriteLock();

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

1 个答案:

答案 0 :(得分:3)

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

final Lock lock = new ReentrantLock();

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

区别在于,lock.lock() [可选等待然后]按预期获取当前线程的锁,但rwLock.writeLock()仅返回ReentrantReadWriteLock实例的写锁定部分而且不会试图锁定任何东西。至于this example,代码看起来应该是这样的:

final ReadWriteLock rwLock = new ReentrantReadWriteLock();

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

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