多生產者-消費者中假死現象的處理
單個的生產者-消費者模型
package com.ftf.thread.lock;
public class Factory {
private volatile boolean flag = true;
private Object obj = new Object();
public void setValue(){
synchronized (obj) {
try {
while(!flag){
obj.wait();
}
System.out.println("生產者生產資料......");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
obj.notify();
}
}
public void getValue(){
synchronized (obj) {
try {
while(flag){
obj.wait();
}
System.out.println("消費者消費資料....");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
obj.notify();
}
}
public static void main(String[] args) {
final Factory ft = new Factory();
Thread product = new Thread(new Runnable() {
@Override
public void run() {
while(true){
ft.setValue();
}
}
});
Thread customer = new Thread(new Runnable() {
@Override
public void run() {
while(true){
ft.getValue();
}
}
});
customer.start();
product.start();
}
}
但是如果,多啟動一個生產者消費者,或者生產者執行緒,就會出現執行緒假死現象,生產者/消費者執行緒不在執行。
public static void main(String[] args) {
final Factory ft = new Factory();
Thread product = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
ft.setValue();
}
}
});
Thread customer = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
ft.getValue();
}
}
});
Thread customer1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
ft.getValue();
}
}
});
Thread customer2 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
ft.getValue();
}
}
});
customer1.start();
customer2.start();
customer.start();
product.start();
}
結果:
原因:在於notify在多生產-多消費者情況下,喚醒的可能是同類,導致生產者或消費者執行緒沒有競爭鎖的機會,出現假死,
解決:notify改為notifyAll,如果使用的是lock鎖的話,多生產者消費者模型中,使用signalAll來解決假死現象
相關文章
- python中多程式消費者生產者問題Python
- 生產者消費者
- Java實現生產者和消費者Java
- python中多執行緒消費者生產者問題Python執行緒
- 生產者消費者模式模式
- 生產者消費者模型模型
- python 多執行緒實現生產者與消費者模型Python執行緒模型
- Java多執行緒——生產者消費者示例Java執行緒
- java實現生產者消費者問題Java
- python 生產者消費者模式Python模式
- 多執行緒併發如何高效實現生產者/消費者?執行緒
- 生產消費者模式模式
- 使用BlockQueue實現生產者和消費者模式BloC模式
- 使用Disruptor實現生產者和消費者模型模型
- Java多執行緒——消費者與生產者的關係Java執行緒
- 使用Python佇列和多執行緒實現生產者消費者Python佇列執行緒
- 九、生產者與消費者模式模式
- 生產者與消費者問題
- ActiveMQ 生產者和消費者demoMQ
- Python-多執行緒及生產者與消費者Python執行緒
- 「Kafka應用」PHP實現生產者與消費者KafkaPHP
- 生產者消費者模式,以及基於BlockingQueue的快速實現模式BloC
- 生產者與消費者之Android audioAndroid
- linux 生產者與消費者問題Linux
- 新手練習-消費者生產者模型模型
- python多執行緒+生產者和消費者模型+queue使用Python執行緒模型
- Java 多執行緒基礎(十二)生產者與消費者Java執行緒
- C++ condition_variable 實現生產者消費者模型C++模型
- 使用wait()與notifyAll()實現生產者與消費者模式AI模式
- 生產者消費者問題-C++程式碼實現C++
- Qt基於QSemaphore的生產者消費者模型QT模型
- java編寫生產者/消費者模式的程式。Java模式
- 生產者消費者模式--java多執行緒同步方法的應用模式Java執行緒
- 訊號量實現生產者消費者(程式碼邏輯有問題,不適合多個消費者,不常用)
- Kafka中消費者延遲處理訊息Kafka
- 阻塞佇列和生產者-消費者模式佇列模式
- C#多執行緒學習(三) 生產者和消費者C#執行緒
- 使用slice和條件變數實現一個簡單的多生產者多消費者佇列變數佇列