为什么说“除非深思熟虑,尽量使用 notifyAll()”?

article/2025/6/8 5:30:10

notify notifyAll 都可以唤醒等待的线程,但是应该使用 notify 还是 notifyAll 就比较有争议了。那么我们应该如何选择?今天的文章可能会对你有帮助。本文共2595字,预计阅读时间7分钟

notify notifyAll 都可以唤醒等待的线程,但是应该使用 notify 还是 notifyAll 就比较有争议了。那么我们应该如何选择?今天的文章可能会对你有帮助。本文共2595字,预计阅读时间7分钟

一. 序

当做多线程同步时,等待-通知机制是我们比较常用的一种选择,而 Java 中,等待-通知机制有多种实现,我们接触最早也是最熟悉的,应该就是 Java 语言内置的 synchronized 配合 wait、notify、notifyAll 这三个方法来实现。

如何利用 synchronized 实现等待-通知机制,我想大家都比较熟悉,就无需多说了。 notify 和 notifyAll 都可以唤醒等待的线程,但是应该使用 notify 还是 notifyAll 就比较有争议了。

一种比较流行的说法就是, 除非深思熟虑,否则尽量使用 notifyAll

我们今天就这个问题,来讨论一下这两个方法如何选择。

二. 等待-通知机制2.1 什么是等待通知机制

在此之前,先来聊聊什么是等待-通知机制,以及它能解决什么问题?

在使用并发编程时,利用多线程来提高任务的执行效率,但是每个线程在执行时,都有一些先决条件需要被满足。例如生产者消费者模式下,消费者线程能够执行的先决条件,就是生产者产生了一个待消费的数据。

那么如果线程要求的条件,不满足时,循环等待是一种方案,循环间隔一段时间,再重新尝试验证条件是否满足,但是这样的循环等待,在某些场景下,可能会循环很多次,导致大量消耗 CPU 资源。

更好的方案,则是等待-通知机制。 当线程要求的条件不满足时,主动进入等待状态,等线程等待的条件,再次被满足后,通知这个等待的线程重新执行。这就解决了 CPU 资源,因为循环而导致消耗的问题。

对标到 Synchronized 中,被 Synchronized 标记的代码块,被称为 临界区,在同一时刻,只有一个线程能过获取 Synchronized 的互斥锁,进入临界区执行。

线程处于临界区时,一旦发现执行条件不满足时,则可以调用 wait 或者 wait(time_out) 方法,进入等待,例如消费者发现没有更多需要处理的数据,此时就调用 wait 方法,进入等待,等待生产者产生一条新的待消费数据。接下来如果生产者线程,产生了一个新的数据后,就需要唤醒之前等待的消费者线程,去处理这条数据。这里的唤醒操作,就是调用 notify 或者 notifyAll 方法。

可以看到, notify 和 notifyAll 的作用是一致的,都是去唤醒等待中的线程。但是也正如他们方法名所描述的, notify 会"随机"唤醒一个等待线程,而 notifyAll 会尝试唤醒所有的等待中的线程。

注意这里的唤醒,并不是真的唤醒去执行,实际上只是让处于等待的线程,有重新获取锁的争抢权,也就是说,哪怕此时有一百个线程处于等待状态,此时调用 notifyAll 也只会有一个线程获取到锁,允许进入临界区执行。

这在底层中,其实是利用了两个等待队列来实现的,分别是 入口队列EntrySet)和 等待队列WaitSet)。

被 Synchronized 阻塞等待的线程,会进入入口队列,而当条件不满足时,主动调用 wait 方法进入等待的线程,则会进入等待队列

在等待队列中的线程,如果不被唤醒,则永远没有锁的争抢权,无法获取锁也就无法被执行。

2.2 为什么说尽量使用 notifyAll?

终于进入主题了,就前面的描述,看似应该是使用 notify 更好一些。 因为即便我们通知了等待队列中,所有的线程,但同一时刻,也只有一个线程可以获取互斥锁,进入临界区执行,这么看来 notify 会更高效一些。

但是这里埋下来一个风险,就是只使用 notify 可能会导致某些线程,一直处于等待队列中,而永远不会被唤醒并获得执行权

理想情况下,一次等待( wait)对应一次通知( notify),是非常完美的,但是实际业务场景下,可能做不到。

举个例子,在多生产者消费者模式下,待处理的数据队列只有一条数据了,理想场景下,消费者在处理掉一条数据后,理论上应该唤醒生产者再生产一条新的待消费数据。可是 notify 是随机唤醒,也就是它可能会唤醒一个消费者线程,这个消费者线程,发现没有待处理的数据,此时条件不满足,又主动进入等待队列。

也正是因为如此,在并发编程中有个范式模板:

synchronized( this){

while(条件不满足) {

wait;

}

// ...

}

这段代码,大家应该很熟悉, notify 只能保证唤醒一个线程,但是不保证线程执行的时候,曾经的等待条件已经被满足了。为了保证可靠性,此处使用循环检测的方式,只有必要条件满足时,才继续执行。

正是因为 notify 随机唤醒的特点,导致在多条件的情况下,会导致某些线程永远不会被通知到。稳妥的方式,是使用 notifyAll ,让等待中的线程,都有一次再执行的权利。

这也就是为什么说, 除非深思熟虑,否则尽量使用 notifyAll

2.3 什么是深思熟虑?

使用 notifyAll 主要是为了稳定,减少程序的复杂度,我们程序员,解决的是一系列工程问题,虽然有时候需要挑战一些性能的极限,但是大多数时候应该是以稳定且易读易维护为出发点实现功能。

但是在程序的世界中,永远没有绝对的银弹。不带场景去分析问题,都是耍流氓。

前面说 “除非深思熟虑”,那什么场景下才可以用到深思熟虑?

其实只要满足三个条件即可:

  1. 线程进入等待队列的条件相同。
  2. 在满足条件时,所有线程执行的逻辑相同。
  3. 当一个线程执行完( 无论是否异常 ),必定唤醒一个线程。

怎么理解呢?

当所有的线程,执行相同的业务逻辑,那么触发等待的条件也必定相同,只要保证一个线程在退出的时候,必定调用 notify 唤醒一个线程。满足这些条件,就可以只使用 notify 方法。

生产者消费者模式,必定是不满足的,它把线程分为两个性质,做着不同的任务,等着着不同的条件。但是这种情况下,使用 Lock&Condition 会更适合。

三. 小结时刻

到这里,我相信大家已经理解了 notify 和 notifyAll 的区别了,在多数场景下,推荐使用 notifyAll 的主要原因就是因为稳定,毕竟我们大多数时候解决的是工程问题。

具体怎么使用就见仁见智了,你有什么不同的见解,欢迎 留言讨论。 转发、点好看是最大的支持,谢谢!

极客看文章,你们看极客

每天转载优质内容,你们来看我就好了!

我们的口号是:信极客,没bug!

极客看文章,你们看极客

每天转载优质内容,你们来看我就好了!

我们的口号是:信极客,没bug!


http://www.hkcw.cn/article/JhpAaeLuoU.shtml

相关文章

宁波象山港跨海大桥最大钢吊箱成功下放

4月2日,中交二航局参建的浙江宁波象山港跨海大桥69号主墩钢吊箱顺利下放到位,大桥南侧主航道桥正式进入承台施工的新阶段,标志着大桥主墩全面完成由水下桩基施工向水上施工的重大工序转换。 宁波市域铁路象山线全长约61.45公里,其中象山港跨海大桥全长8.26公里,跨海段桥梁…

原创光绪元宝最新的成交价115万,你家里有这样的钱币吗?

藏品名称:清 湖北省造光绪元宝 藏品分类:邮品钱币>钱币 拍卖预估价: RMB 1,320,000 拍品尺寸:直径2.8cm,重6.9g 拍卖日期:2024-05-25 藏品介绍:湖北省造光绪元宝作为近代钱币中精美铸币之一,其确实风格独特,文化内涵丰富。龙乃中国的象征、中华民族文化的象征。该币…

原创曾万众瞩目,如今却被淡忘了的网红都怎样了?

那时候王宝强刚和马蓉离婚,事情正闹得满城风雨,众人皆知。 芙蓉姐姐之所以这么说,是因为自己与王宝强有相似的经历。芙蓉姐姐说到这时显然是有些得意的,她说:“虽然不是刻意找比自己小,但因为对方一直追,感觉对方是真心地就在一起了。另外,虽然他们比我小,但是感觉情商…

原创12年了,因为一句“没钱就来中国”被封的刁蛮公主,现在还好吗

#娱乐聚焦# 2008年,第29届奥运会在北京召开。 开会前一百天,会歌《北京欢迎你》发行。 献唱的华人群星中,有一抹身影尤为耀眼。这个面容娇俏的黄衣女子,是国外女星张娜拉。 值得一提的是,张娜拉是唯一一位受官方邀请献唱此歌的外国人。 不久后,张娜拉又成为了北京奥运会首…

天下父母必读!100本养育家教经典著作

父母是孩子最好的老师和榜样,家庭教育需要讲究科学和方法,而且父母的阅读习惯、家庭的阅读氛围将直接影响到孩子的阅读习惯和能力。 1.《爱的教育》 【意】亚米契斯(著);王干卿(译) 2.《教育漫话》 【英】约翰洛克(著),徐诚、杨汉麟(译) 3.《爱的艺术》 【美】弗洛…

原创每周1500万只,美国竟往巴拿马投放食人蝇,到底是何居心?

一架运输机从巴拿马上空飞过,机腹舱门打开,一团黑雾降了下来。这架飞机来自美国,它投放的是一种非常恐怖的苍蝇——食人蝇。这样一架飞机携带的食人蝇数量有1500万只,美国人这是想干什么?想打生物战吗?在生物战上美国的确是行家,但还不至于这么明目张胆的释放生化武器。…

福清茶食,没想到做工这么讲究!

茶食是我们福清的特色小吃之一,在过去大街小巷到处可以见到卖茶食的小摊贩,他们挑着扁担往来于茶肆之间,售卖茶食,所以那个时候喝茶不叫‘喝茶’,而叫‘吃茶’,吃的,自然就是茶食了,当然了,我们今天福清方言说喝茶还是‘吃茶’。 今天小编就来教大家做福清茶食。首先需…

csgo大姐姐awp多少钱-大姐姐awp价格一览

CSGO作为一款备受瞩目的枪战射击类游戏,拥有丰富的武器系统和多样的战斗策略。在这款游戏中,枪械的皮肤成为了玩家们的追求目标,而大姐姐AWP则是一款独具魅力的皮肤,被誉为“男人的浪漫”。那么,这款炫酷的皮肤究竟价值几何呢?下面,就让我们一起来了解一下CSGO中大姐姐A…

原创《祈今朝》洛昭言喜欢洛埋名还是闲卿?洛昭言最后和谁在一起了?

《祈今朝》洛昭言的感情线令人好奇,她喜欢洛埋名还是闲卿?最后跟谁在一起了?大家都想知道洛昭言和洛埋名之间是什么关系,有点骨科的味道。洛昭言和洛埋名是洛望平的孩子,洛昭言小时候被断言活不长,父亲为了她向狼妖求取了半生修为。洛望平去世后,洛昭言和洛埋名相依为命…

武昌砍头事件心理学还原:规则的破坏与人伦的失守

2月18日下午4时30分,武汉市公安局通过网络平台发布一条消息:2月18日中午12时25分,武汉市武昌火车站附近,发生一起恶性刑事事件。犯罪嫌疑人胡某(22岁,四川宣汉人),因口角纠纷,在一面馆门口持面馆菜刀,将面馆业主姚某(42岁,湖北郧西人)砍死。民警快速出警,现场将犯罪嫌…

农行值得办的入门卡和高端卡盘点

大家好,我是 爱生活的燃烧,全网同名,欢迎关注。 同事来问我日常消费和偶尔出境旅行应该办什么信用卡,我首先想到的是农行,突然发现农行好像没对手了。 其实农行也在温暖升级,去年农行信用卡兑换里程的比例,从20:1贬值到40或25:1,相对来说比较温和。 悠然悦白金卡、车主…

【物理试卷】2024年新高一入学考试物理试卷

展开全文答案:来源:常释物理,版权归原作者所有,如有侵权联系删除。 免责声明:自媒体综合提供的内容均源自自媒体,版权归原作者所有,转载请联系原作者并获许可。文章观点仅代表作者本人,不代表环球物理立场。 环球物理 ID:huanqiuwuli 环球物理,以物理学习为主题,以传…

这部三无小电影,很有韵味

轰轰烈烈的高考季告一段落。 前些天。院长也想着找一些高考青春片来为准考生们打打鸡血。 但是励志鸡汤终归只能提供速效的刺激感,并不能给出长期的方法论。 最典型的就是:“考上大学以后就轻松了”。 暂不论这句话禁不禁得起推敲,考上了就轻松了,那没考上的那群人,过得怎…

名作家双眼失明后,她成了代笔

一览扶桑 从日常开始,带你重新发现一个深度日本 芥川龙之介有一个短篇小说,题为《戏作三昧》,写的是江户时代通俗小说家曲亭马琴,末尾描述他家里的情景——曲亭马琴(1767–1848年) 马琴在圆筒形座灯的昏暗光亮下接着写《南总里见八犬传》的稿子。执笔时家里人都不进这间书…

原创古代“一两银子”,相当于多少人民币?你每月工资有几两银子

货币在日常生活中占据着重要地位,与我们的生活发展息息相关。我国历史上,货币从贝壳、铜币到银锭,再从金银到纸币的发展,无一不见证了我国古代商业活动的繁荣。 由于不同社会时期,社会生产力水平不一,所以在各个朝代的货币购买力也存在一定差异。 在明清小说中,就经常出…

从二里街到三里庵,百年商圈生生不息!

▲ 摄影:子恒 说起近年来合肥最活跃的传统商圈,以淮河路步行街为核心的“四牌楼商圈”是毋庸置疑的第一,而位于城西的三里庵紧随其后。也许有人对此持不同看法,欢迎留言畅谈。话说回来,当人们最早关注到这里时,可能就有了疑问:此地果真有“庵”?答案是肯定的,而且那座…

出口外销发票开具规范及指南

出口外销发票,即企业出口货物、对外提供加工修理修配劳务、发生跨境应税行为,需要开具的发票。在江苏省,生产企业一律使用升级后的增值税系统开具普通发票代替原来的出口发票,外贸企业可以选择“使用升级后的增值税系统开具普通发票”或者“开具企业自制凭证”两种方式。发…

原创蒙牛vs伊利,顶级官赞的价值不如普通赞助商了?

作者|李静林 2023年总收入,伊利超过1200亿,蒙牛接近千亿;市值,伊利超1500亿人民币,蒙牛531亿港币。两大巨头合占中国乳业半壁江山,断崖式领先。 老大老二间的战争从未停歇。当争夺焦点全部汇聚在巴黎奥运赛场,领先者想巩固地位,落后者希望绝地反击。 2019年蒙牛联合可口…

美国大学研究生留学一次性说清楚!

因多重因素叠加,选择去美国进一步深造的学生越来越多。数据显示,中国依然是留美第一大生源地,而在中国留学生中,有34.7%的人入读本科,43.5%的人入读研究生,美国研究生申请尤其是top30的申请竞争一年比一年激烈。 在如此形势下,作为申请者,我们更要“知己知彼”、做好万…

6款汽车搬运器,掀翻智能停车领域

随着城市经济的快速发展,全新的、现代的商业综合体在一座座城市不断崛起,人们在享受休闲娱乐的同时,也在为停车泊车等问题犯难,6款智能停车搬运器以智能停车为核心,引入AGV机器人技术,开启无人值守的智能化停车管理模式,全面提升了泊车效率。 第一款:梳齿二层简易升降智…