多生產者-消費者中假死現象的處理
單個的生產者-消費者模型
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
- Java實現生產者-消費者模型Java模型
- 生產者和消費者(.net實現)
- Java多執行緒——生產者消費者示例Java執行緒
- Python中的生產者消費者問題Python
- python中多執行緒消費者生產者問題Python執行緒
- java實現生產者消費者問題Java
- 生產消費者模式模式
- 多執行緒併發如何高效實現生產者/消費者?執行緒
- 用Python多執行緒實現生產者消費者模式Python執行緒模式
- python 多執行緒實現生產者與消費者模型Python執行緒模型
- Java多執行緒——生產者和消費者模式Java執行緒模式
- Java多執行緒14:生產者/消費者模型Java執行緒模型
- 使用BlockQueue實現生產者和消費者模式BloC模式
- 使用Disruptor實現生產者和消費者模型模型
- 九、生產者與消費者模式模式
- python 生產者消費者模式Python模式
- ActiveMQ 生產者和消費者demoMQ
- Java多執行緒——消費者與生產者的關係Java執行緒
- 多執行緒下的生產者和消費者-BlockingQueue執行緒BloC
- 「Kafka應用」PHP實現生產者與消費者KafkaPHP
- 新手練習-消費者生產者模型模型
- 關於Java多執行緒實現生產者和消費者的問題Java執行緒
- 使用Python佇列和多執行緒實現生產者消費者Python佇列執行緒
- [原創]C#編寫的多生產者多消費者同步問題C#
- Java 多執行緒基礎(十二)生產者與消費者Java執行緒
- Python-多執行緒及生產者與消費者Python執行緒
- 多執行緒-生產者消費者問題程式碼1執行緒
- Qt基於QSemaphore的生產者消費者模型QT模型
- java編寫生產者/消費者模式的程式。Java模式
- 有名訊號量實現消費者生產者問題
- 阻塞佇列和生產者-消費者模式佇列模式
- linux 生產者與消費者問題Linux
- 直觀理解生產者消費者問題