2015-04-03 48 views
0
package threads; 

import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 


public class text implements Runnable { 
    static Lock lock = new ReentrantLock(); 

    public static void main(String[] args) throws InterruptedException { 

     testts(); 
     new Thread(new text()).start(); 

    } 

    static void testts() { 
     lock.lock(); 
    } 

    @Override 
    public void run() { 
     lock.unlock(); 

     System.out.println("un-locked"); 
    } 
} 

抛出我的代码抛出java.lang.IllegalMonitorStateException

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException 
    at java.util.concurrent.locks.ReentrantLock$Sync.tryRelease(ReentrantLock.java:127) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1175) 
    at java.util.concurrent.locks.ReentrantLock.unlock(ReentrantLock.java:431) 
    at threads.text.run(text.java:28) 
    at java.lang.Thread.run(Thread.java:619) 
+2

你为什么认为**不应该抛出'IllegalMonitorStateException'? – 2015-04-03 01:08:46

回答

2

javadoc of ReentrantLock#unlock()状态

如果当前线程不是此锁的则 IllegalMonitorStateException抛出持有人。

您的新线程没有锁,主线程会。因此,当新线程试图解锁它不保存的锁时,会抛出异常。

相关问题