前言

wait和notify必须在synchronized块中,否则会抛出IllegalMonitorStateException。

原因

代码示例

class BlockingQueue {Queue<String> buffer = new LinkedList<String>();public void give(String data) {buffer.add(data);notify();                   }public String take() throws InterruptedException {while (buffer.isEmpty())    wait();return buffer.remove();}
}

代码示例的问题所在

一个消费者调用take,发现buffer.isEmpty。
在消费者调用wait之前,由于cpu的调度,消费者线程被挂起,生产者调用give,然后notify。
然后消费者调用wait (注意,由于错误的条件判断,导致wait调用在notify之后,这是关键)。
如果很不幸的话,生产者产生了一条消息后就不再生产消息了,那么消费者就会一直挂起,无法消费,造成死锁。

关键

总是让give/notify和take/wait为原子操作。wait/notify是线程之间的通信,他们存在竞态,我们必须保证在满足条件的情况下才进行wait。换句话说,如果不加锁的话,那么wait被调用的时候可能wait的条件已经不满足了(如上述)。由于错误的条件下进行了wait,那么就有可能永远不会被notify到,所以我们需要强制wait/notify在synchronized中。

为什么wait和notify只能在synchronized中?相关推荐

  1. 为什么wait和notify必须放在synchronized中?

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) 在多线程编程中,wait 方法是让当前线程进入休眠状态,直到另一个线程调 ...

  2. 为什么wait、notify必须在synchronized保护的同步代码中

    先思考如果wait.notify不在synchronized保护的同步代码中的样子: //经典的生产者与消费者 public class BlockingQueue{Queue<String&g ...

  3. Java synchronized 中的while 和 notifyAll

    转载自  Java synchronized 中的while 和 notifyAll 问题1 为什么是while 而不是if 大多数人都知道常见的使用synchronized代码: synchroni ...

  4. 常见的锁策略、synchronized中的锁优化机制

    一.常见的锁策略 锁策略,和普通程序猿基本没啥关系,和 "实现锁" 的人才有关系的 这里所提到的锁策略,和 Java 本身没关系,适用于所有和 "锁" 相关的情 ...

  5. sleep()、yield()、join()、wait()/notify()、interupt()——多线程中常用的方法

    一.sleep()--线程休眠 线程休眠:指的是让线程暂缓执行一下,等到了预计时间之后再恢复执行. 线程休眠会交出CPU,让CPU去执行其他的任务.sleep() 方法不会释放锁,也就是说如果当前线程 ...

  6. synchronized 中的 4 个优化,你知道几个?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) synchronized 在 JDK 1.5 时性能是比较低的,然而在后续的版本中 ...

  7. 利用pip3安装包只能在python2中调用

    利用 pip3 安装的 python 扩展包只能在 python2 中调用 首先检查下,是不是 pip3 命令和 pip 命令都同时指向了系统的 python2 版本. 我的便是这种情况: MacBo ...

  8. 为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开?

    为什么matlab生成的exe文件只能在matlab中打开,在电脑的其他地方打不开? 2014-11-09 20:20147****3349 | 浏览 448 次  操作系统 在同一个电脑里,在mat ...

  9. 【重难点】【Java集合 02】Set、List、Map 的区别、常见的线程安全的集合类、Collection 为什么只能在 Iterator 中删除元素

    [重难点][Java集合 02]List.Set.Map 的区别.常见的线程安全的集合类.Collection 为什么只能在 Iterator 中删除元素 文章目录 [重难点][Java集合 02]L ...

最新文章

  1. 使用Apache对Tomcat进行负载均衡
  2. 给Oracle表空间Tablespace扩展库文件
  3. TeamViewer 14 on Nvidia Jetson TX2
  4. mysql docker自动化_docker自动化部署
  5. 【javascript 变量和作用域】
  6. es7 bulk api 批量插入es
  7. 爬虫常用Xpath和CSS3选择器对比
  8. 【华为云技术分享】如何整合hive和hbase
  9. 亚信安全认证acse_重装出发 | 2019亚信安全合作伙伴大会珠海站召开
  10. KVM安装(RHEL_6.4x64)
  11. weblogic查看版本号教程
  12. Linux 从查看本机地址到端口映射
  13. 新计算机 安装win2000,诚请指教如何在较新配置电脑中安装win2000及其VHD系统
  14. MATLAB切比雪夫带通滤波器
  15. 西安电子科技大学-数字电路与逻辑设计大作业-汽车尾灯显示控制电路
  16. html中字体 楷体_css设置各种中文字体如雅黑、黑体、宋体、楷体等等
  17. 射频电路PCB设计技巧
  18. invalid index of a 0-dim tensor
  19. MFC窗体的扩展样式和其值
  20. SQL的常见函数的使用方法和举例说明

热门文章

  1. 求解旅行商问题C语言的算法,【算法作业】用回溯法求解旅行商问题
  2. 皮一皮:这剧透的太厉害了...
  3. 皮一皮:这是传说盖浇饭中的天花板~白粥盖浇饭...
  4. 这个需求很简单,明天上线没问题吧?要不要怼回去?
  5. 在家办公的第一天,钉钉、企业微信集体“崩溃”...
  6. Spring Cloud Config Server迁移节点或容器化带来的问题
  7. 技术专题讨论:JPA vs MyBatis ?您如何选择?(有奖活动)
  8. catia 快捷键 激活零件_CATIA基本操作技巧
  9. Panoptic SegFormer:全景分割第一名!南大港大英伟达提出新算法,霸榜全景分割
  10. Meshlab和CloudCompare截图时去除“旋转圈”