8 27 虛假喚醒

2021-09-26 14:19:28 字數 2014 閱讀 7673

什麼情況下會導致虛假喚醒:當執行緒是使用 if 對鎖進行判斷而不是while ,在第一次判斷標誌位的時候條件成立進入 wait()方法,然後當別的執行緒喚醒這個執行緒的時候,它就不會再去判斷一次標誌位而是直接往下執行了,這樣一來,當有多個執行相同功能的執行緒在 wait() 方法中等待的時候,一旦這些執行緒被同時喚醒,就會同時執行,這個時候就會有問題。

package 虛假喚醒及其解決;

class resource

* 這裡使用if 對num進行判斷會出現「 虛假喚醒 」 問題, 因為當加法執行緒判斷num != 0成立的時候,就會進入if 的執行體中,也就是執行了

* this.wait();然後等待,當有乙個減法執行緒執行完之後就會去喚醒這個加法執行緒,當然,在只有乙個加法執行緒的時候問題不會凸顯,但是一旦

* 有不止乙個加法執行緒進入了this.wait()進行等待的時候,這是一旦減法執行緒使用notify()方法喚醒執行緒,這兩個加法執行緒就會立刻執行,而不管

* num 的值是什麼了。

* 使用了while 之後,當有兩個加法執行緒在this.wait()方法中等待,而有乙個減法執行緒通知了加法執行緒可以執行的時候,這兩個加法執行緒還是會對

* num進行一次判斷

*/if(num != 0)

++num;

system.out.println(thread.currentthread().getname() + " and num is " + num);

this.notifyall();

}synchronized void numsub() throws interruptedexception

--num;

system.out.println(thread.currentthread().getname() + " and num is " + num);

this.notifyall();

}}public class testbysynchronize catch (interruptedexception e)

}},"aa").start();

new thread(()-> catch (interruptedexception e)

}},"bb").start();

new thread(()-> catch (interruptedexception e)

}},"cc").start();

new thread(()-> catch (interruptedexception e)

}},"dd").start();

}}package 虛假喚醒及其解決;

class resource

++num;

system.out.println(thread.currentthread().getname() + " and num is " + num);

this.notifyall();

}synchronized void numsub() throws interruptedexception

--num;

system.out.println(thread.currentthread().getname() + " and num is " + num);

this.notifyall();

}}public class testbysynchronize catch (interruptedexception e)

}},"aa").start();

new thread(()-> catch (interruptedexception e)

}},"bb").start();

new thread(()-> catch (interruptedexception e)

}},"cc").start();

new thread(()-> catch (interruptedexception e)

}},"dd").start();

}}

wait 虛假喚醒

public class spuriouswakeuptest private void consume catch interruptedexception e product product 1 if product 0 如果沒有產品,在lock物件上等待喚醒,如果有產品,消費.private ...

執行緒的虛假喚醒

所謂虛假喚醒字面意思理解就是執行緒在被喚醒後,執行緒執行等待的變數條件實際上仍然不滿足,這種情況發生在兩個以上的多執行緒生產者消費者問題中。從乙個實際的例子中來理解虛假喚醒,建立乙個簡單的消費者生產者模型,判斷條件時共享資源number是否等於0,等於0時,生產者讓其 1,不等於0時,消費者讓其 1...

執行緒虛假喚醒問題

在執行緒通訊中可能存在虛假喚醒問題,關於虛假喚醒的概念,我覺得官方文件說得不太清晰,下面通過乙個例子簡單說明 現在有兩個方法,乙個 1,乙個 1,每個方法開啟2個執行緒迴圈執行10次 實現 public class test a start new thread b start new thread...