透过云端的道路, 只亲吻攀登者的足迹
所谓虚假唤醒,是指线程调用wait方法, 在没有收到明确的通知(notify)的情况下被唤醒
虚假唤醒可能与线程竞争和调度策略有关, 这可以由操作系统或java虚拟机(jvm)的线程调度器引起, 以下是具体原因:
线程竞争:
当多个线程在等待相同的线程时, 其中一个线程被通知唤醒, 其他线程也可能会被唤醒, 即使他们没有收到显示的通知调度策略:
操作系统或jvm的线程调度器在没有明确的通知时, 有可能会唤醒wait中的线程, 这是为了提高系统整体的性能或实现其他调度目标虚拟机优化:
虚拟机有可能对wait和notify进行优化, 造成虚假唤醒在多线程环境中, 可以使用while循环
检查条件确保线程在收到显示通知才唤醒, 从而确保当前线程在被唤醒时仍然满足执行条件
. 具体实现在https://editor.csdn.net/md/?articleId=133772574 的完善阻塞队列
中讲到