2013-07-24 48 views
2

当从finally块内部解锁时,我的程序会抛出IllegalMonitorStateException。 Javadoc说,如果当前线程没有保存这个锁,就抛出这个异常。但是,如果程序到达finally块,它必须先获得一个锁。锁在其他地方没有解锁。锁可能“迷路”?ReentrantReadWriteLock丢失 - 引发IllegalMonitorStateException

代码示例:

final ReadWriteLock rwLock = new ReentrantReadWriteLock(); 

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

回答

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() -and也readLock() -return同锁,每次相同的线程,因此所取得的锁定不需要被关在一个变量解锁它后,你可以简单地获得“一个新的”来解锁“旧的”,因为它们必然是相同的。 (这是因为Thread.currentThread()是静态的。)