电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java wait和notify虛假喚醒原理

瀏覽:3日期:2022-09-02 17:50:07

自己在此記錄一下,方便日后復習。

虛假喚醒的概念

jdk官方文檔解釋:

Java wait和notify虛假喚醒原理

所以說在wait和notify一塊使用時,如果使用if作為條件時,會有虛假喚醒的情況發生,所以必須使用while作為循環條件。下面來舉例實驗:

首先,創建一個資源類:(在多線程中,一般都是資源類和線程操作解耦,不放在用同一個類中,只有在線程操作資源類時,才會創建資源類的對象)

package com.test;/** * 資源類 * @author Huxudong * @createTime 2020-04-01 21:57:39 **/public class Resource { /** 產品數 */ private int product = 0; /** 進貨 */ public synchronized void get() { if(product >= 10) { System.out.println(Thread.currentThread().getName()+':'+'產品已滿!'); /** 當商品已經滿的時候,進貨線程掛起 */ try {this.wait(); } catch (InterruptedException e) {e.printStackTrace(); } } /** 進貨 */ System.out.println(Thread.currentThread().getName()+':'+ ++product); /** 喚醒其他線程 */ this.notifyAll(); } /** 售貨 */ public synchronized void sale() { if(product <= 0) { System.out.println(Thread.currentThread().getName()+':'+'產品已空'); try {this.wait(); } catch (InterruptedException e) {e.printStackTrace(); } } /** 售貨 */ System.out.println(Thread.currentThread().getName()+':'+ --product); /** 喚醒其他線程 */ this.notify(); }}

然后再創建線程來操作我們的資源類(通過java8新特性Lambda表達式直接創建)

package com.test;import java.util.concurrent.TimeUnit;/** * 線程操作資源類,實現線程與資源類的解耦合 * @author Huxudong * @createTime 2020-04-01 23:13:54 **/public class TestPc { public static void main(String[] args) { Resource resource = new Resource(); new Thread(()->{ for (int i = 0; i < 20; i++) {try { /** 睡眠,便于觀察結果 */ TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) { e.printStackTrace();}resource.get(); } },'生產者A').start(); new Thread(()->{ for (int i = 0; i < 20; i++) {resource.sale(); } },'消費者C').start(); new Thread(()->{ for (int i = 0; i < 20; i++) {resource.get(); } },'生產者B').start(); new Thread(()->{ for (int i = 0; i < 20; i++) {resource.sale(); } },'消費者D').start(); }}

先來看看如果使用if條件會發生什么:

Java wait和notify虛假喚醒原理

對,你沒看錯,怎么可能會出現負數呢,這肯定是不對的。冷靜下來分析一下,還是有點頭緒,知道哪里出現了問題的(那你是一個處事不驚的人,很厲害)。

來,分析一下,一開始先調用了消費者C,D線程(因為我們寫了睡眠在生產者中),消費者此時發現此時product資源為0,所以,消費者C,D這兩個兄弟,沒辦法只能調用wait方法,睡眠了,并且釋放了鎖。

但是此時第一個消費者已經蘇醒了,發動機開始生產產品了,并且生產之后,又喚醒了所有等待的消費者線程。這消費者C,D兩兄弟終于蘇醒了,D哥們先獲得了鎖,所以就先消費了一個產品,然后就又發現沒有產品了,又傷心的休眠去了,但是不要忘了,此時還有一個C哥們被喚醒了啊,你喚醒了人家,人家總的干點什么事情吧,不然這多難受,剛好不巧的是,此時的判斷條件是if,所以此時C哥們便不受條件的約束,接著上面自己睡眠的代碼處執行,毅然決然的又去消費了一個產品,原來D哥們消費后,就已經為0了,這個C哥們再去消費減一,不就是-1了嗎,以此類推分析。發現如果判斷條件用不好,此時喚醒的C哥們就相當于虛假喚醒的了,會給程序帶來不可預估的錯誤。所以在這里判斷必須要使用while,先來看看把if換成while的結果。

Java wait和notify虛假喚醒原理

這回結果就比較正常了,為什么使用while就可以呢,因為像上文所說,即使喚醒了所有的消費者線程,此時會不停while循環判斷,如果此時條件是為0,那么C哥們就不能出while,那么他也就不回執行下面消費產品的減減操作了,那么就會避免了這種錯誤。這也是官方提倡的在使用wait 和notifyAll的時候,必須使用while循環條件判斷。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 分子精馏/精馏设备生产厂家-分子蒸馏工艺实验-新诺舜尧(天津)化工设备有限公司 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 工业制氮机_psa制氮机厂家-宏骁智能装备科技江苏有限公司 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 流变仪-热分析联用仪-热膨胀仪厂家-耐驰科学仪器商贸 | 20年条刷老厂-条刷-抛光-工业毛刷辊-惠众毛刷 | 视觉检测设备_自动化检测设备_CCD视觉检测机_外观缺陷检测-瑞智光电 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | 深圳昂为官网-气体分析仪,沼气分析仪,动态配气仪,气体传感器厂家 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 厦门网站建设_厦门网站设计_小程序开发_网站制作公司【麦格科技】 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 心得体会网_心得体会格式范文模板 | 厂房出租_厂房出售_产业园区招商_工业地产&nbsp;-&nbsp;中工招商网 | 国际金融网_每日财经新资讯网| 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 山东柳店新能源科技有限公司| 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 武汉宣传片制作-视频拍摄-企业宣传片公司-武汉红年影视 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 楼承板-开闭口楼承板-无锡海逵楼承板 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」| 施工围挡-施工PVC围挡-工程围挡-深圳市旭东钢构技术开发有限公司 | 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 厚壁钢管-厚壁无缝钢管-小口径厚壁钢管-大口径厚壁钢管 - 聊城宽达钢管有限公司 | 建筑资质代办-建筑资质转让找上海国信启航| 蜜蜂职场文库_职场求职面试实用的范文资料大全 |