傳統的生產者消費者問題,防止虛假傳喚

2021-10-23 01:43:19 字數 2396 閱讀 6984

生產者和消費者問題

生產者和消費者問題 synchronized 版

package com.kuang.pc;

/*** 執行緒之間的通訊問題:生產者和消費者問題!

* 等待喚醒,通知喚醒 執行緒交替執行 a b 操作同乙個變數 num = 0

* * a num+1 b num-1

* */

public

class

acatch

(interruptedexception e)}}

,"a").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"b").

start()

;}}// 判斷等待,業務,通知

class

data

number++

; system.out.

println

(thread.

currentthread()

.getname()

+"=>"

+number)

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

this

.notifyall()

;}public

synchronized

void

decrement()

throws interruptedexception

number--

; system.out.

println

(thread.

currentthread()

.getname()

+"=>"

+number)

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

this

.notifyall();}}

輸出

問題存在,a b c d 4 個執行緒! 虛假喚醒

if 改為 while 判斷

package com.kuang.pc;

/*** 執行緒之間的通訊問題:生產者和消費者問題!

* 等待喚醒,通知喚醒 執行緒交替執行 a b 操作同乙個變數 num = 0

* * a num+1 b num-1

* */

public

class

acatch

(interruptedexception e)}}

,"a").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"b").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"c").

start()

;new

thread((

)->

catch

(interruptedexception e)}}

,"d").

start()

;}}// 判斷等待,業務,通知

class

data

number++

; system.out.

println

(thread.

currentthread()

.getname()

+"=>"

+number)

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

this

.notifyall()

;}public

synchronized

void

decrement()

throws interruptedexception

number--

; system.out.

println

(thread.

currentthread()

.getname()

+"=>"

+number)

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

this

.notifyall();}}

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

什麼是虛假喚醒?當乙個條件滿足時,喚醒了多個執行緒,其中部分執行緒不能被執行卻執行了 比如操作乙個變數 number初始是0,執行緒a對number進行 1,執行緒b對number進行 1,現在沒有問題。但是,再有執行緒c對number進行 1和執行緒d對number進行 1時,就會出現不只是0和1...

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...

生產者 消費者問題

在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...