java里 对线程的wait方法只有在synchronized下才有用吗?

 我来答
百度网友d208a3406
2010-11-09 · 超过19用户采纳过TA的回答
知道答主
回答量:44
采纳率:0%
帮助的人:39.2万
展开全部
不是,可以不用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()方法通知正在等待的线程。
jamxval
2015-07-21 · TA获得超过6822个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1418万
展开全部

调用 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();
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dingqiaowu
2010-11-09 · TA获得超过200个赞
知道小有建树答主
回答量:612
采纳率:0%
帮助的人:432万
展开全部
不是
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式