新手 Java 多线程 wait()

.wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。
那 .wait前面的对象要填什么 。有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait

图片说明

        .wait() 的作用是 让当前线程进入等待状态,同时释放当前线程所持有的锁。

那 .wait前面的对象要填什么 。有两个synchronized 拿了 prev和slef 两个对象锁,为什么下面只有一个wait ,又为什么是prev的wait

3个回答

self锁的执行部分已经结束了,锁已经释放。这个wait让当前线程阻塞并释放prev的锁。
假设此时的self为a,prev为c,那执行wait后a的锁已经释放,这段代码的逻辑是在多线程状态下按顺序循环输出各个线程的name,所以需要等上一个线程释放锁当前线程才能运行,也就是prev.wait()
附一个你可能看过的链接
https://www.cnblogs.com/csuwater/p/5411693.html

weixin_41423378
银翼的魔术师s 嗨 ,再问一下 如果A线程调用了 obj.wait() ,是不是要 B(其他)线程调用 obj.notify() 才能醒来
一年多之前 回复
weixin_41423378
银翼的魔术师s 看别人强调 wait可以释放锁,以为只有wait才能释放锁
一年多之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 对,下次提问记得详细描述自己不懂得地方,因为这个问题一般都会直接略过
一年多之前 回复
weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
一年多之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 希望你可以提供一下你认为的应该执行两个wait或self.wait()的原因
一年多之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 释放自己是为了让下一个等待资源的线程得以运行,我觉得你所想的释放自己的锁应该指的是释放控制台这个公共资源,因为每一个对象并不是公共资源其实没有加锁的必要,这里用每一个对象加锁是为了保证顺序执行。其实这种逻辑可以设置一个变量order指定应输出的线程,然后各线程竞争order的锁然后执行order=(order+1)%3来结束,但是这种方法效率不高,因为可能唤醒现在不应该输出的线程
一年多之前 回复
JonathanYan
JonathanYan 回复weixin_41423378: 因为它要按顺序输出,也就是下次输出时要确定prev已经释放锁。例如pb类执行完了后要等待a的锁( a.wait ),这样下次pa执行完了,a.notify语句可以唤醒pb在a.wait位置的阻塞,保证按顺序输出
一年多之前 回复
weixin_41423378
银翼的魔术师s 大佬这么说更蒙蔽了呀 为什么 self执行完自己就释放了 ,perv执行完自己没释放要 wait
一年多之前 回复

和对象没啥关系 是指你所调用wait的线程进行阻塞

weixin_41423378
银翼的魔术师s 是不是 synchronized 代码段执行完 锁会自己释放,不用wait也会释放 锁 ? 之所以使用wait是为了使该线程 阻塞
一年多之前 回复

这个代码的逻辑应该是self被prev唤醒(要按顺序输出),而不是被自己唤醒(这样还是乱序输出,而且由于self.notify()执行的时候self.wait()还没有将self放入等待队列,该线程可能会丢失这个notify,运行一次输出就永久阻塞了)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐