生產者與消費者的虛假喚醒問題

2021-10-05 21:37:09 字數 1618 閱讀 7575

什麼是虛假喚醒?

當乙個條件滿足時,喚醒了多個執行緒,其中部分執行緒不能被執行卻執行了

比如操作乙個變數:number初始是0,執行緒a對number進行+1,執行緒b對number進行-1,現在沒有問題。但是,再有執行緒c對number進行+1和執行緒d對number進行-1時,就會出現不只是0和1的結果了。

明明加了鎖,為什麼還會產生負數情況?

是因為wait等待放在了if判斷裡面。

if判斷只執行一次,然後就執行if()下邊的了。而while會一直判斷,直到滿足條件才執行while()下邊的**

**原因:

if (number != 0)
解決辦法時把2個地方的if換成while就可以了。

while (number != 0)
下邊是不會產生虛假喚醒的**。(把while換成if就可以出現虛假喚醒)

/**

* 虛假喚醒

* 執行緒交替執行 操作同乙個變數 num

*/public

class

acatch

(interruptedexception e)}}

,"a").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"bb").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"ccc").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"dddd").

start()

;}}//數字 資源類

class

data

number++

; system.out.

println

(thread.

currentthread()

.getname()

+"->"

+number)

;//通知其他執行緒,+1完畢

this

.notifyall()

;}//執行 -1

public

synchronized

void

decrement()

throws interruptedexception

number--

; system.out.

println

(thread.

currentthread()

.getname()

+"->"

+number)

;//通知其他執行緒,-1完畢

this

.notifyall()

;}}

生產者與消費者案例 虛假喚醒

以下是乙個案例,有乙個店員,負責進貨和賣貨。進貨生產,賣貨消費。當商品超過10件,生產等待,消費繼續,當少於0件,消費等待,消費繼續。正常 如下 package com.atguigu.juc 生產者和消費者案例 public class testproductorandconsumer 店員cla...

生產者消費者模式之虛假喚醒

當出現虛假喚醒時,解決方法 將if判斷改為while迴圈。在弄懂虛假喚醒之前,先了解兩個定義 1 重入 重入 意味著獲取鎖的操作的粒度是 執行緒 而不是 呼叫 2 執行緒的生命週期 執行緒狀態圖 當我們只有兩個執行緒的時候,即 a 生產者 和 b 消費者 整個模式不會出現問題,當增加兩個執行緒 c ...

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...