java里 对线程的wait方法只有在synchronized下才有用吗?
3个回答
展开全部
不是,可以不用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()方法通知正在等待的线程。
其实,从并发的角度考虑,wait是不能放在synchronized锁里的,会引起死锁。
试考虑,当wait和notify方法都在synchronized锁里的时候,调用wait方法前将对象锁住,然后调用wait方法,线程被挂起,需要其它线程调用notify将其唤醒。
由于notify方法也在synchronized里面,其它线程调用notify的时候要获得对象的锁,但此时锁已经被wait所在的线程持有,而且wait线程已经被挂起,所以notify因为无法获得锁而挂起,这样二者相互等待,导致死锁。
Java里面可以将wait和notify放在synchronized里面,是因为Java是这样处理的:
在synchronized代码被执行期间,线程调用对象的wait()方法,会释放对象锁标志,然后进入等待状态,然后由其它线程调用notify()或者notifyAll()方法通知正在等待的线程。
展开全部
调用 a.wait() 前需要拿到这个 a 对象的锁,这是必须的,像下面这样:
List queue = new java.util.LinkedList();
synchronized(queue) {
queue.wait();
}
或者在方法上加了 synchronized,然后用对象自己的锁来等待:
public synchronized boolean get() {
if (queue.isEmpty()) {
this.wait();
}
return queue.removeFirst();
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不是
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询