从IllegalMonitorStateException
块内部解锁时,我的程序会抛出finally
。 Javadoc说,如果当前线程没有持有此锁,则抛出此异常。但是,如果程序到达finally块,则必须先获得锁定。以前其他地方的锁没有解锁。锁可以“迷路”吗?
代码示例:
final ReadWriteLock rwLock = new ReentrantReadWriteLock();
public void doSomething() {
Lock lock = rwLock.writeLock();
try {
doStuff();
} finally {
lock.unlock();
}
}
答案 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()
是静态的。)