2013-07-24 80 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()是靜態的。)