Java中wait()方法为什么要放在同步块中?(lost wake-up 问题):
https://www.cnblogs.com/sunweiye/p/11055550.html

lost wakeup问题

sleep 和 wakeup使用于等待某事发生,用于阻塞和唤醒线程的情形中。

所以sleep的使用逻辑是:检查状态,不符合则调用sleep阻塞当前线程;wakeup的使用逻辑是:改变状态,调用wakeup唤醒对应线程。

lost wakeup问题:(1)线程1首先检查状态,发现不符合。(2)线程2改变状态,调用wakeup方法。但是这时线程1还未调用sleep方法,其还未被阻塞,所以wakeup丢失。(3)最后线程1调用sleep方法,阻塞线程,且无法再被唤醒。

解决方案

  1. sleep 和 wakeup必须位于同一同步块中,且保证sleep方法保证释放锁和阻塞线程的原子性。线程1和线程2在检查/改变状态之前都要先获取锁,sleep方法调用时释放锁,保证线程2无法在线程1检查状态之后,调用sleep方法之前改变状态,并调用wakeup。

  2. sleep方法保证释放锁和阻塞线程的原子性在应用层面很难实现,所以JAVA AQS中先释放锁,再阻塞线程,所以还是会有lost wakeup问题。但是如果wakeup唤醒的对应线程还未被阻塞的话(即释放锁之后,阻塞线程之前),会重复调用wakeup函数,直到对应线程被阻塞,然后对其唤醒。

并发编程 - lost wakeup相关推荐

  1. 2w字 + 40张图带你参透并发编程!

    1  并发历史  在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行.任何资源都会为这个程序服务,在计算机使用某些资源时,其他资源就会空闲,就会存在 浪费资源 的情况. ...

  2. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. Java并发编程(06):Lock机制下API用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Lock体系结构 1.基础接口简介 Lock加锁相关结构中涉及两个使用广泛的基础API:ReentrantLock类和Condition接 ...

  4. 两万字 40 张图带你参透并发编程

    作者 | cxuan 来源 | 程序员cxuan(ID:cxuangoodjob)  并发历史  在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行.任何资源都会为这个 ...

  5. 【JUC高并发编程】—— 初见JUC

    一.JUC 概述 什么是JUC JUC 是 Java并发编程的缩写,指的是 Java.util.concurrent 即Java工具集下的并发编程库 [说白了就是处理线程的工具包] JUC提供了一套并 ...

  6. 我所理解的 iOS 并发编程

    作者:bool周 原文链接:我所理解的 iOS 并发编程 无论在哪个平台,并发编程都是一个让人头疼的问题.庆幸的是,相对于服务端,客户端的并发编程简单了许多.这篇文章主要讲述一些基于 iOS 平台的一 ...

  7. Java 并发编程 常见面试总结

    目录 一. Socket流阻塞 二.  wait和notify 三. 线程实现的两种方式 四. synchronized同步代码块示例 五. ReentrantLock的方法示例 六. Lock和sy ...

  8. 2w 字 + 40 张图带你参透并发编程

    并发历史 在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行.任何资源都会为这个程序服务,在计算机使用某些资源时,其他资源就会空闲,就会存在 浪费资源 的情况. > ...

  9. 2w字 + 40张图带你参透并发编程

    并发历史 在计算机最早期的时候,没有操作系统,执行程序只需要一种方式,那就是从头到尾依次执行.任何资源都会为这个程序服务,在计算机使用某些资源时,其他资源就会空闲,就会存在 浪费资源 的情况. 这里说 ...

  10. 并发理论:并发编程的2大利器 管程 VS 信号量

    并发编程的解决方案 我们在开发的过程中经常会遇到并发的问题,当遇到并发问题的时候,我们通常通过锁来解决.其实锁的实现方案有如下两种 信号量 管程 管程和信号量是等价的,用管程可以实现信号量,也可以用信 ...

最新文章

  1. 关于notepad++中ZenCoding插件失灵的原因
  2. lucene 索引出错 no segments* file found in org.apache.lucene.store.MMapDirectory
  3. JDK 14:记录,文本块等
  4. React开发(150):判断方法有避免报错
  5. JEECG UI标签库做成单独开源项目规划
  6. 计算机知识点数制的概念,计算机等级考试,数制的基本概念知识点
  7. 交换知识 VLAN VTP STP 单臂路由
  8. 如何解决Greenplum中无法通过标准命令修复的元数据错误
  9. 用WPF+MongoDB开发房产信息收集器(4)——房产信息采集器总体介绍附程序下载
  10. 有道翻译与VS2010滚动栏自动反弹冲突问题
  11. Codejock Xtreme ToolkitPro MFC 使用
  12. ClassGraph使用
  13. spark python编程 林子雨_林子雨编著《Spark编程基础(Python版)》教材第5章的命令行和代码...
  14. Python奇技淫巧之Pycharm活动模板配置
  15. 抢购茅台,618只能用这种方法
  16. MD5简单加密实现32位16位字符
  17. Linux下录屏软件obs安装
  18. shadow acne(阴影失真)和peter panning(阴影悬浮)
  19. 小米笔记本和手机通过蓝牙传输文件
  20. 软工实习(四)jsp基础

热门文章

  1. 乡镇特色产业发展情况调研报告
  2. TB,PB, Eb, Zb, YB
  3. 计算机的存储容量1kb表示什么,计算机的存储容量常用KB为单位,这里1KB表示什么?...
  4. UE4 创建地形失败:Unreal Engine 4 Crash Reporter
  5. 202102-一个小屁民的若有所思
  6. 网络爬虫异常处理总结
  7. 表格控件SpreadJS助力上市企业明源云,打造更智慧的地产生态链
  8. 程序语言的自我意识与仿他意识
  9. 公司、办公司内如何限制上外网因特网、只能连内网局域网 - 注册表工具软件、批处理办法 - 注册表转换成批处理BAT,批处理如何修改注册表
  10. 移动定位业务之“Cell ID + RTT(小区识别+往返时间)”