多线程wait()与notify()的一点疑惑 1C

## # 若有多个线程因wait()而阻塞,通知notify()个数等于或大于wait()个数就一定能都通知到吗?PS:是同一个对象锁

希望大神能给出确定答案,最好有证明,不胜感激

3个回答

楼上说法虽然对 但是还点小问题 就是notfify虽然都会唤醒线程 但是并不是调用玩之后即时释放锁,所以最好还是用notfifyall,临界代码中少写耗时的

notfify()是随机唤醒一个,如果从数量上来讲满足大于等于,理论上是可以全部唤醒的。就像一个盒子里有10个球,我每次随机取出一个,随机取10次,请问里面还剩下几个?.....但是不建议这样操作,想全部唤醒可以用notifyAll()

这样和notifyAll是等同的。没必要一个个循环notify。
for循环里面一个个notify,每循环一次,其他wait的线程是不会立马处理的,因为他们还是拿不到锁。
这是因为:当前调用notify的线程绝对是一直持有这个对象的锁的,
(如果当前线程不是对象所得持有者,调用notity,notifiyAll方法抛出一个java.lang.IllegalMonitorStateException 异常。)
而调用notify方法并不会使自己释放锁,于是虽然前面被notify解锁的对象已经不在等待队列了,
但是它还是很着急,它拿不到锁啊,必须等当前线程for循环全部调用完后,才能获取到锁,然而for循环结束后,每个wait的线程都不在等待区了,于是大家还是一起竞争。

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