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的锁吗?
Object o = new Object();
ReentrantLock lock = new ReentrantLock();
lock.lock();
o.wait();
}
为什么程序执行时会在wait方法处报出 java.lang.IllegalMonitorStateException异常呢 ,难道我在执行lock.lock();时没有拿到对象o的锁吗?
解决方案 »
- 请教一个问题
- 请教各位关于Tiles框架的问题?
- 一个关于struts的问题
- struts首页跳转问题
- 祝大家元宵节快乐!!!!!! java怎么 能把 消息 发到activemq 队列里啊
- java web 项目如何设计漂亮的界面(小公司)
- <html:radio>标签如何能让其中的一个radio是初始时候就是选中的??
- 请问那种模式能使我们对数据库的表完全操作,添加字段,删除字段,添加、修改、删除数据页面都能很快完成?
- XP上能装j2ee吗?
- 请问有没有关于怎么在j2ee中开发xml的资料,最好能详细一点!
- java.lang.NullPointerException
- java web 自定义标签
public static void main(String[] args) throws Exception {
Object o = new Object();
ReentrantLock lock = new ReentrantLock();
lock.lock();
synchronized (o) {
o.wait();
} }
使用的方法就是
lock.lock//获取的是另外的锁
....
lock.unlock而你o的对象锁,则需要通过关键字synchronized 来获取锁,即
synchronized (o){
....
}
甚至你要获取某个类的锁,你可以
synchronized (xx.class){
...
}
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();
}
}
有什么区别呢?
代码中使用了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();
}
}
}