日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java notify唤醒原理_Java wait和notify虚假唤醒原理

發布時間:2025/3/11 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java notify唤醒原理_Java wait和notify虚假唤醒原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

虛假喚醒的概念

jdk官方文檔解釋:

所以說在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條件會發生什么:

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

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

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

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

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

總結

以上是生活随笔為你收集整理的java notify唤醒原理_Java wait和notify虚假唤醒原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本久操视频 | 黄色avav| 精品国产无码一区二区三区 | 免费的黄色大片 | 波多野结衣女同 | 老太脱裤让老头玩ⅹxxxx | 午夜影视福利 | 国产精品15p | 嫩草影院菊竹影院 | 午夜在线视频观看 | 国产精品入口夜色视频大尺度 | 亚洲小说春色综合另类 | 午夜av一区二区 | 在线视频精品免费 | 性欧美久久 | 欧美另类精品xxxx孕妇 | 久久一级黄色片 | 最好看的电影2019中文字幕 | 国产精品一区二区免费视频 | 风间由美av | 日美毛片| 韩国三级视频在线观看 | 人妻互换 综合 | 国产精品一区二区三区四区 | 国产一区视频网站 | 男人天堂2019 | 天天人人| 国产精品视频免费播放 | 国产在线综合视频 | 91第一页 | xxxx视频在线 | 欧美极品视频在线观看 | 人妻无码中文久久久久专区 | 小嫩女直喷白浆 | 亚洲字幕 | 97视频网站 | 五月婷中文字幕 | 国产www视频 | 情欲少妇人妻100篇 黄色一级片欧美 | 亚洲一区第一页 | 超碰69 | 亚洲精品国产乱伦 | 99福利| 欧美一区二区三区免费视频 | 午夜伦伦 | www.成人网.com | 黑人欧美一区二区三区 | 亚洲视频一区二区三区四区 | 人人澡人人澡人人澡 | 夜夜操影视 | 三级网站在线 | 久久精品第一页 | 国产精品9191| 香蕉网在线观看 | 国产一二三视频 | 美女毛片在线观看 | 欧美人与性动交a欧美精品 日韩免费高清视频 | 国产奶头好大揉着好爽视频 | 好吊妞视频一区二区三区 | 欧美精品一 | 久热欧美 | 性欧美精品| 国产一区二区视频在线免费观看 | 毛片3 | 久久澡 | 成人快手免费看片 | 欧美成人69 | 欧美日韩一 | 日本黄色aaa | 亚洲欧美综合另类自拍 | av久热| 欧美视频直播网站 | 久久资源av| 91精品国产综合久久久密臀九色 | 永久免费精品影视网站 | 欧美激情图 | 波多野结av衣东京热无码专区 | 一区二区视频观看 | 日本熟妇一区二区三区 | 亚洲一区二区三区高清视频 | 国产麻豆一精品一av一免费 | 欧美三级免费看 | 欧美一区二区三区婷婷月色 | av色区| 久久撸视频 | 国产成人精品在线 | juliaannxxxxx高清| 亚洲资源网 | 日本一区二区在线看 | 精品一区在线 | 久久久久久无码午夜精品直播 | 国产乱人伦app精品久久 | 亚洲图片中文字幕 | 欧美日韩亚洲国产一区 | 色屋在线 | 久久国产精品无码网站 | 欧美在线免费视频 | 国产古装艳史毛片hd | 日韩亚洲区 |