一个关于对象锁的问题
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();
}
}
}