java里 对线程的wait方法只有在synchronized下才有用吗?
检举| 2010-11-09 12:29
不是,可以不用synchronized,但Java推荐在调用wait方法前将对象锁住
其实,从并发的角度考虑,wait是不能放在synchronized锁里的,会引起死锁。
试考虑,当wait和notify方法都在synchronized锁里的时候,调用wait方法前将对象锁住,然后调用wait方法,线程被挂起,需要其它线程调用notify将其唤醒。
由于notify方法也在synchronized里面,其它线程调用notify的时候要获得对象的锁,但此时锁已经被wait所在的线程持有,而且wait线程已经被挂起,所以notify因为无法获得锁而挂起,这样二者相互等待,导致死锁。
Java里面可以将wait和notify放在synchronized里面,是因为Java是这样处理的:
在synchronized代码被执行期间,线程调用对象的wait()方法,会释放对象锁标志,然后进入等待状态,然后由其它线程调用notify()或者notifyAll()方法通知正在等待的线程。
提问者评价
谢谢 不过还是不太明白
java里 对线程的wait方法只有在synchronized下才有用吗?
转载
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
python配置信息使用字典存储时读取很麻烦
深入学习Python内置数据类型之——字典(Dictionary)  
dictionary python weblogic server object