当前位置: 首页 > news >正文

”wait”和“notify”为什么要在Synchronized代码块里面?

wait和notify用来实现多线程之间的协调,wait表示让线程进入到阻塞状态,notify表示让阻塞的线程唤醒。

  1. wait和notify必然是成对出现的,如果一个线程被wait()方法阻塞,那么必然需要另外一个线程通过notify()方法来唤醒这个被阻塞的线程,从而实现多线程之间的通信。
  2. 在多线程里面,要实现多个线程之间的通信,除了管道流以外,只能通过共享变量的方法来实现,也就是线程t1修改共享变量s,线程t2获取修改后的共享变量s,从而完成数据通信。但是多线程本身具有并行执行的特性,也就是在同一时刻,多个线程可以同时执行。在这种情况下,线程t2在访问共享变量s之前,必须要知道线程t1已经修改过了共享变量s,否则就需要等待。同时,线程t1修改过了共享变量S之后,还需要通知在等待中的线程t2。所以要在这种特性下要去实现线程之间的通信,就必须要有一个竞争条件控制线程在什么条件下等待,什么条件下唤醒。IMG_1594.PNG
  3. 而Synchronized同步关键字就可以实现这样一个互斥条件,也就是在通过共享变量来实现多个线程通信的场景里面,参与通信的线程必须要竞争到这个共享变量的锁资源,才有资格对共享变量做修改,修改完成后就释放锁,那么其他的线程就可以再次来竞争同一个共享变量的锁来获取修改后的数据,从而完成线程之前的通信。
  4. 所以这也是为什么wait/notify需要放在Synchronized同步代码块中的原因,有了Synchronized同步锁,就可以实现对多个通信线程之间的互斥,实现条件等待和条件唤醒。
  5. 另外,为了避免wait/notify的错误使用,jdk强制要求把wait/notify写在同步代码块里面,否则会抛出IllegalMonitorStateException
  6. 最后,基于wait/notify的特性,非常适合实现生产者消费者的模型,比如说用wait/notify来实现连接池就绪前的等待与就绪后的唤醒。

http://www.mrgr.cn/news/20012.html

相关文章:

  • 用Python实现时间序列模型实战——Day 11: 指数平滑模型
  • matlab 计算3D点到三角面的距离
  • 【基础算法总结】BFS_拓扑排序问题
  • 模电-三极管2
  • 推荐一款开源、高效、灵活的Redis桌面管理工具:Tiny RDM!支持调试与分析功能!
  • 华为OD机试真题 - 停车场车辆统计 - 贪心算法(Java/Python/JS/C/C++ 2024 D卷 200分)
  • 【Rust光年纪】构建高效气象模型计算系统:Rust语言库推荐与比较
  • 浅聊kubernetes 调度
  • 使用Python实现智能金融市场预测
  • 读软件设计的要素01概念
  • ASTER L2 表面反射率 SWIR 和 ASTER L2 表面反射率 VNIR V003
  • 向量数据库之Milvus
  • 独孤思维:副业不要被用户牵着鼻子走
  • RPC框架-Dubbo
  • 电脑知识:如何恢复 Word、媒体和存档文件?
  • Python 中的 None 是什么,探秘 None 的多种用途
  • ssh之登录服务器自动进入目录(四十七)
  • HART转Modbus转换器
  • Alibaba Cloud Linux 3.2104 LTS 64位 安装php8
  • 手游开发:后端框架