线程安全之wait的虚假唤醒 --- 没有调用notify就被唤醒

小王学习录

  • 今日鸡汤
  • 什么是虚假唤醒
  • 虚假唤醒的原因
  • 如何避免虚假唤醒

今日鸡汤

透过云端的道路, 只亲吻攀登者的足迹

什么是虚假唤醒

所谓虚假唤醒,是指线程调用wait方法, 在没有收到明确的通知(notify)的情况下被唤醒

虚假唤醒的原因

虚假唤醒可能与线程竞争和调度策略有关, 这可以由操作系统或java虚拟机(jvm)的线程调度器引起, 以下是具体原因:

  1. 线程竞争: 当多个线程在等待相同的线程时, 其中一个线程被通知唤醒, 其他线程也可能会被唤醒, 即使他们没有收到显示的通知
  2. 调度策略: 操作系统或jvm的线程调度器在没有明确的通知时, 有可能会唤醒wait中的线程, 这是为了提高系统整体的性能或实现其他调度目标
  3. 虚拟机优化: 虚拟机有可能对wait和notify进行优化, 造成虚假唤醒

如何避免虚假唤醒

在多线程环境中, 可以使用while循环检查条件确保线程在收到显示通知才唤醒, 从而确保当前线程在被唤醒时仍然满足执行条件. 具体实现在https://editor.csdn.net/md/?articleId=133772574 的完善阻塞队列中讲到

你可能感兴趣的:(操作系统,java,开发语言,操作系统,线程安全,虚假唤醒,bug,安全)