java 同步块疑惑 本帖最后由 jiangpan007 于 2014-12-02 11:14:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 test1 wait后释放了对象锁,test2得到对象锁,test2 wait又释放了,然后test1 print ,然后test2 print 楼主对 wait理解错了。wait的时候,锁是释放的状态。 thread test1 get the lockthread test2 get the lock程序打印出这两句很快的,执行wait(1000)并不会立即释放对象锁,而是要等同步块执行完后再释放,我理解不了你的说法。能分析下执行顺序吗 希望楼主发代码的时候能够将其格式转换为java格式,不然这样格式的代码看着就不舒服,别人怎么会耐心给你解答呢,just suggestion 调用wait方法会堵塞当前线程是吧,如果2个线程都释放了对象锁,又都没能notify,这是不是死锁。我把代码改成下面这样,不指定wait时间,运行程序后程序一直运行,并且永远没执行到打印running这行代码。public void run() { synchronized(objectlock){ // TODO Auto-generated method stub try { System.out.println(name+" get the lock"); objectlock.wait(); System.out.println(name+" running......."); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ objectlock.notify(); } } } 还想问个问题,objectlock.wait(2000)执行后,当前线程(线程A)挂起,等2000毫秒会尝试获取对象锁吧,如果还没有到达2000毫米,另一线程(线程B)执行notify,线程A是立即获得对象锁吗,还是必须等待2000毫秒后才获得对象锁;另外我测试,假如线程A挂起200毫秒,B线程先sleep 1000毫秒再释放对象锁,线程A会再1000毫秒后获得对象锁,是不是可以这样理解,当200毫秒后,线程A就一直尝试获得对象锁,直到线程B释放对象锁。 不是。是立即释放对象锁,然后处于等待状态2000毫秒,时间到了,结束这个等待状态,然后试图再尝试获取锁,以便继续执行wait之后的语句。 【高分求解】UTF8编码JSP通过GET方式接受GBK乱码 异常问题 想用java实现winXP的关机效果 寻用dtree.js实现的无限树性菜单(有复选框勾选) 初学者的一个疑问 switch语句中的*号问题 java.io.IOException: 拒绝访问。 如何从log文件提取信息? java经典问题! 求大神优化代码,小弟初学JAVA protected关键字 a==b是比较对象的什么东西?
thread test2 get the lock
程序打印出这两句很快的,执行wait(1000)并不会立即释放对象锁,而是要等同步块执行完后再释放,我理解不了你的说法。能分析下执行顺序吗
我把代码改成下面这样,不指定wait时间,运行程序后程序一直运行,并且永远没执行到打印running这行代码。public void run() {
synchronized(objectlock){
// TODO Auto-generated method stub
try {
System.out.println(name+" get the lock");
objectlock.wait();
System.out.println(name+" running.......");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
objectlock.notify();
}
}
}
不是。是立即释放对象锁,然后处于等待状态2000毫秒,时间到了,结束这个等待状态,然后试图再尝试获取锁,以便继续执行wait之后的语句。