wait 和 notify 这个为什么要在synchronized 代码块中?

一个工作七年的小伙伴,竟然不知道” wait”和“notify”为什么要在 Synchronized 代码块中
好吧,如果屏幕前的你也不知道,请在公屏上刷”不知道“。
对于这个问题,我们来看看普通人和高手的回答。

一、问题解析

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

二、问题总结

这个是一个典型的经典面试题。
其实考察的就是 Synchronized、wait/notify 的设计原理和实现原理。
由于 wait/notify 在业务开发整几乎不怎么用到,所以大部分人回答不出来。
其实并发这块内容理论上来说所有程序员都应该要懂,不管是它的应用价值,还是设计理念,非常值得学习和借鉴。
好的,本期高手面试系列的文章就到这里结束了,喜欢的朋友记得点赞和 收藏。

三、粉丝福利

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份 50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我
公众号:“ 
灰灰聊架构 ”, 回复暗号:“ 321 ”即可获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/231222.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactNative 常见问题及处理办法(加固混淆)

目录 文章目录 摘要 引言 正文 ScrollView内无法滑动 RN热更新中的文件引用问题 RN中获取高度的技巧 RN强制横屏UI适配问题 低版本RN(0.63以下)适配iOS14图片无法显示问题 RN清理缓存 RN navigation参数取值 pod install 或者npm install 44…

iview 选择框远程搜索 指定筛选的参数

问题:开启了filterable之后,选择框是允许键盘输入的,但是会对选择列表进行过滤,如果不想使用再次过滤,可以试下下面这个方法。 场景:输入加密前的关键字筛选,选择框显示加密后的数据 说明一&a…

救命,现在当行政真的可以不用太老实

行政的姐妹在哪里啊?这个打工工具真的要知道哦! 信我,真的好用啊!终于不用自己写总结写材料的啊! 这东西写啥都可以,只要输入需求马上就写好了啊,什么工作总结,活动策划方案&#…

MySQL基础笔记(4)DQL数据查询语句

DQL用于查找数据库中存放的记录~ 目录 一.语法 二.基础查询 1.查询多个字段 2.设置别名 3.去除重复记录 三.条件查询 1.基础语法 2.常见条件 四.分组查询 1.聚合函数 2.语法 五.排序查询 六.分页查询 附注:DQL执行顺序 1.编写顺序 2.执行顺序 ​​​…

open3d连线可视化

目录 写在前面准备代码运行结果参考完 写在前面 1、本文内容 open3d 2、平台/环境 windows10, visual studio 2019 通过cmake构建项目,跨平台通用;open3d 3、转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/135407857…

系列十、Spring Cloud Gateway

一、Spring Cloud Gateway 1.1、概述 Spring Cloud全家桶中有个很重要的组件就是网关,在1.x版本中采用的是Zuul网关,但是在2.x版本中,由于Zuul的升级一直跳票,Spring Cloud最后自己研发了一个网关替代Zuul,即&#xf…

【合阳新起点公益】“关爱留守儿童 守护牙齿健康”牙膏发放活动

为了关爱儿童的口腔健康,帮助他们改善生活状况,养成良好的刷牙习惯。合阳县未成年人保护中心、合阳县新起点公益服务中心组织链接到汕头市惠泽人志愿服务中心,为孩子们申请到一批儿童爱心牙膏套盒,分别于2023年12月22日、12月30日…

MAC系统安装多版本JDK

文章目录 1.JDK下载与安装2.查看安装过那些版本的jdk3.查看是否存在.bash_profile4.配置环境变量5.实现版本切换6.有些Mac可能版本问题,在关闭终端后,配置会失效! 1.JDK下载与安装 官网下载地址: https://www.oracle.com/java/technologies/…

【前端】[vue3] vue-router使用

提示:我这边用的是typeScript语法,所以js文件的后缀都是ts。 安装vue-router: (注意:vue2引用vue-router3 vue3才引用vue-router4) npm install vue-router4src文件夹下面创建 router/index.ts(…

【Go】excelize库实现excel导入导出封装(二),基于map、多个sheet、多级表头、树形结构表头导出,横向、纵向合并单元格导出

前言 大家好,这里是符华~ 之前写了一篇 go excelize库封装导入导出 的博客,然后那篇博客还挖了个坑,结果这个坑差点就填不上了🤣还好经过我的不懈努力,总算是把坑给填上了。。。 挖坑 上一篇文章中,我们…

鸿蒙 Window 环境的搭建

鸿蒙操作系统是国内自研的新一代的智能终端操作系统,支持多种终端设备部署,能够适配不同类别的硬件资源和功能需求。是一款面向万物互联的全场景分布式操作系统。 下载、安装与配置 DevEco Studio支持Windows系统和macOS系统 Windows系统配置华为官方推…

LVGL核心部件——弧(arc)控件的介绍

概述 本文介绍LVGL核心部件——弧(arc),它由背景和前景弧组成。前景(指示器)可以进行触摸调整。 LVGL核心部件——弧(arc)控件 一、部件和样式 LV_PART_MAIN 使用典型的背景样式属性绘制背景&…

基于PHP的校园代购商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的校园代购商城系统 一 介绍 此校园代购商城系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。(附带参考设计文档) 技术栈:phpmysqlbootstrapphpstudyvscode 二 功能 …

制造业企业使用SD-WAN的意义

在信息技术和制造业越来越密不可分的背景下,推进智能制造,需要升级网络支撑工业互联网平台的搭建、数字化车间、智能工厂的建设等等。SD-WAN的应用使得制造业企业网络升级更为方便、快捷、低成本。 制造业企业总部、分支机构、工厂一般分布较为分散&…

Android MVP 写法

前言 Model:负责数据逻辑 View:负责视图逻辑 Presenter:负责业务逻辑 持有关系: 1、View 持有 Presenter 2、Model 持有 Presenter 3、Presenter 持有 View 4、Presenter 持有 Model 辅助工具:ViewBinding 执行…

静态网页设计——跑友原创区(HTML+CSS+JavaScript)

前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 感谢大佬的视频: https://www.bilibili.com/video/BV1AK411x75x/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术:HTMLCSSJS 主要内容&am…

全网最细,接口+接口自动化测试面试题汇总(附回答)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、我们测试的接口…

02-微服务-Eureka注册中心

Eureka注册中心 假如我们的服务提供者user-service部署了多个实例,如图: 大家思考几个问题: order-service在发起远程调用的时候,该如何得知user-service实例的ip地址和端口?有多个user-service实例地址,…

「Vue3面试系列」Vue3 所采用的 Composition Api 与 Vue2 使用的 Options Api 有什么不同?

文章目录 开始之前正文一、Options Api二、Composition Api三、对比逻辑组织Options APICompostion API 逻辑复用 小结 开始之前 Composition API 可以说是Vue3的最大特点,那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开…

杨中科 ASP.NETCore开发效率利器 HOT RELOAD

HOT RELOAD 1、困惑:修改了服务器端的代码,必须重新运行程序。 2、方法1: [启动 (不调试) ] 3、方法2: .NET 6开始的Hot Reload(热重载) 正常修改代码后 不重启,是无法看到新的数据展示在页面 修改 运行结果: 方式一:设置开始…