日期:2014-05-18  浏览次数:20713 次

一个关于对象锁的问题
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的锁吗?

------解决方案--------------------
你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();
        }

    }

------解决方案--------------------
lock.lock没有拿到o的对象锁,而是你自己ReentrantLock lock = new ReentrantLock();新new的一个锁对象。
使用的方法就是
lock.lock//获取的是另外的锁
....
lock.unlock

而你o的对象锁,则需要通过关键字synchronized?来获取锁,即
synchronized?(o){
....
}
甚至你要获取某个类的锁,你可以
synchronized?(xx.class){
...
}

------解决方案--------------------
既然都使用了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();
}
}
}