首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

一个关于对象锁的有关问题

2013-06-25 
一个关于对象锁的问题public static void main(String[] args) throws Exception {Object o new Object(

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

热点排行