什麼是虛假喚醒?
當乙個條件滿足時,喚醒了多個執行緒,其中部分執行緒不能被執行卻執行了明明加了鎖,為什麼還會產生負數情況?比如操作乙個變數: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 ...
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...