Spurious wakeup

一般来说,线程进入休眠状态,直到下面四种情况发生:

  1. 其他线程调用被锁对象的notify方法,唤醒此线程
  2. 其他线程调用被锁对象的notifyAll方法,唤醒阻塞的所有线程
  3. 其他线程调用了此线程的interupt方法
  4. 指定的时间到了

线程在其他情况下醒来,就叫做虚假唤醒。

官方解释:

means that when you wait on a condition variable, the wait may (occasionally) return when no thread specifically broadcast or signaled that condition variable. Spurious wakeups may sound strange, but on some multiprocessor systems, making condition wakeup completely predictable might substantially slow all condition variable operations. The race conditions that cause spurious wakeups should be considered rare."

就是说,如果要防止极少发生的虚假唤醒,这样就会放缓所有条件变量的操作。(如果一定要不发生虚假唤醒的话,就会很慢…)

所以写程序的话,一定要对虚假唤醒作处理。

举个例子:

synchronized(obj) {while(!some_conditions){obj.wait();}
}

需要:

  1. wait方法必须在同步内
  2. 循环检测条件是否成立

spurious wakeup -- 多线程之虚假唤醒相关推荐

  1. 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)

    生产者与消费者模式 一个生产者与一个消费者 题目:现在有两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量加1,另一个线程对该变量减1,这两个线程的操作加一.减一交替,进行10轮,变量的初始 ...

  2. java线程打水问题_Java 多线程 wait() 虚假唤醒问题

    本文分享 wait()  的虚假唤醒(Spurious Wakeups)问题,会说明什么是虚假唤醒,以及如何解决. 先看一下相关的 java doc: java doc 说由于中断和虚假唤醒可能会发生 ...

  3. linux虚假唤醒(spurious wakeup)

    1.Linux对虚假唤醒的说明 On a multi-processor, it may be impossible for an implementation of pthread_cond_sig ...

  4. wait和notify的虚假唤醒(spurious wakeups)

    文章目录 1 现象 2 虚假唤醒 1 现象 这个词的定义来源于JDK的Object#wait()方法的注解 官方API明确的告诉我们,为了防止发生中断错误以及虚假唤醒的问题,我们需要将wait()方法 ...

  5. pthread_cond_wait的spurious wakeup问题

    最近在温习pthread的时候,忽然发现以前对pthread_cond_wait的了解太肤浅了.昨晚在看<Programming With POSIX Threads>的时候,看到了pth ...

  6. 多线程并发编程需要注意虚假唤醒Spurious wakeup

    虚假唤醒  Spurious wakeup 如果等待线程在没有通知被调用的情况下唤醒,则称为Spurious wakeup. 解决方案就是: 使用while条件判断,更好的方案是避免使用wait这种低 ...

  7. java suprious wakeup_多线程编程中条件变量和的spurious wakeup 虚假唤醒

    1. 概述 条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制.典型的场景包括生产者-消费者模型,线程池实现等. 对条件变量的使用包括两个动作: 1)线程等待某 ...

  8. Java多线程之线程虚假唤醒

    Java多线程之线程虚假唤醒 本文目录提纲 问题:两个线程对一个初始值为零的变量操作,实现一个线程加一,另一个线程减一,来十次. 问题:四个线程对一个初始值为零的变量操作,实现两个线程加一,另外两个线 ...

  9. 条件变量的虚假唤醒(spurious wakeups)问题

    引言 条件变量是我们常用的同步原语之一,它的正确使用方式一般如下图: 在wait端,我们必须把判断布尔条件和wait()放到while循环中,而不能用if语句,原因是可能会引起虚假唤醒. 那么,究竟什 ...

  10. java中wait和notify的虚假唤醒问题

    前言 本篇博客来自 https://www.cnblogs.com/clover-forever/p/12616869.html 自己在此记录一下,方便日后复习. 虚假唤醒的概念 jdk官方文档解释: ...

最新文章

  1. ISME: 北大吴晓磊课题组揭示合作演化新机制:“自私”驱动合作关系的建立?...
  2. 一种基于FPGA 的1080p 高清多摄像头全景视频拼接的泊车(机)
  3. map的key可以试一个数组吗?_【自考】数据结构第三章,数组,期末不挂科指南,第5篇...
  4. Linux命令使用汇总
  5. 切换账户、切换命令行和图形界面
  6. 谈谈网站设计时图片的使用
  7. java 多线程输出_[Java多线程]ABC三个线程顺序输出的问题
  8. 记一次失败的Windows环境编译Nginx源码
  9. 小程序音视频能力技术负责人解读“小程序直播”
  10. 无广告的pdf阅读器_奥利给!免费无广告!功能超齐全!这样的良心国产软件,真的不多了!...
  11. SQL语言基础:SQL语言概念知识笔记
  12. 证券期货行业监管大数据治理方案研究
  13. 【编程练习】复习一下树的遍历
  14. java设置绝对布局_浅谈Java绝对布局 原创
  15. 疯狂kotlin讲义连载之流程控制——顺序结构与分支结构 二
  16. AE动画导出json工具:bodymovin
  17. macOS如何刷新DNS缓存
  18. 请解释jsonp的工作原理
  19. Matlab 和 Simulink 教程学习基础入门
  20. 物联网现状及未来发展趋势

热门文章

  1. 在领导面前吃不开的4种员工,中一条就别指望提拔了,说的真准
  2. 使用biopython查询NCBI数据库
  3. 【职业】什么是架构师?
  4. 儿童python编程教程-儿童编程python入门
  5. centos7快速搭建KMS服务器
  6. 电脑搜索不到打印机应该怎么办?
  7. 小程序-仿微信通讯录-字母导航
  8. Vue如何优雅地进行事件解绑和解绑
  9. MAC快捷键---8
  10. 智能优化算法的常用改进方法