用notify替代notifyAll减少线程竞争时waitOfferCount和waitPollCount的作用
问题解答
空notify调用的危害
waitOfferCount 和 waitPollCount 的核心作用确实是避免无意义的notify调用,不做这个判断不会引发逻辑错误,但会产生不必要的性能损耗:
notify是管程模式下的重量级操作,调用时需要操作系统内核参与调度等待队列,哪怕没有任何线程在对应锁上等待,调用notify也需要完成锁校验、内核态切换等操作,白白消耗CPU资源- 高并发场景下,如果队列长期处于非满非空的状态,大量空
notify调用带来的性能损耗会被放大,降低队列整体吞吐量
无计数器是否可以安全使用notify
你的判断是正确的,没有这两个计数器也可以安全使用notify,原因是这个队列实现做了锁拆分设计:
- 入队操作只竞争
offerLock,只有入队线程会在offerLock上等待 - 出队操作只竞争
pollLock,只有出队线程会在pollLock上等待
两类线程不会混等同一把锁,所以每次notify必然只会唤醒对应操作的等待线程,不存在唤错线程的风险,哪怕直接去掉计数器判断每次都调用notify,队列的逻辑正确性也不会受影响,只是性能会差一些。
补充说明
这个计数器的判断是线程安全的:计数器的增减和wait操作都在持有对应锁的同步块内执行,判断wait*Count>0时也持有对应锁,等待线程要从wait返回必须先拿到锁,所以不会出现判断完成后、执行notify前等待线程刚好退出的情况,空通知的过滤是完全可靠的。
内容的提问来源于stack exchange,提问作者waynewing
相关产品推荐
相关产品推荐

