public static void main(String[] args) throws Exception {
Object o = new Object();
ReentrantLock lock = new ReentrantLock();
lock.lock();
o.wait();
}
为什么程序执行时会在wait方法处报出 java.lang.IllegalMonitorStateException异常呢 ,难道我在执行lock.lock();时没有拿到对象o的锁吗?

解决方案 »

  1.   

    你lock.lock()与o有半毛钱关系??
        public static void main(String[] args) throws Exception {
            Object o = new Object();
            ReentrantLock lock = new ReentrantLock();
            lock.lock();
            synchronized (o) {
                o.wait();
            }    }
      

  2.   

    lock.lock没有拿到o的对象锁,而是你自己ReentrantLock lock = new ReentrantLock();新new的一个锁对象。
    使用的方法就是
    lock.lock//获取的是另外的锁
    ....
    lock.unlock而你o的对象锁,则需要通过关键字synchronized 来获取锁,即
    synchronized (o){
    ....
    }
    甚至你要获取某个类的锁,你可以
    synchronized (xx.class){
    ...
    }
      

  3.   

    那么
     public static void main(String[] args) throws Exception {
            Object o = new Object();
            ReentrantLock lock = new ReentrantLock();
            lock.lock();
            synchronized (o) {
                o.wait();
            }
     
        }

    public static void main(String[] args) throws Exception {
            Object o = new Object();
            synchronized (o) {
                o.wait();
            }
     
        }
    有什么区别呢?
      

  4.   

    既然都使用了ReentrantLock,那就配合Condition来使用,
    代码中使用了ReentrantLock又使用object.wait();有点不协调。
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;public class LockTest { final Lock lock = new ReentrantLock();
    final Condition condition = lock.newCondition(); public void doLogic(Object x) throws InterruptedException {
    lock.lock();
    try {
    while (XX) {
    condition.await();
    }
    // do something
    } finally {
    lock.unlock();
    }
    }
    }