Java學習之執行緒 死鎖 生產者消費者模式

2021-06-29 00:14:31 字數 1621 閱讀 3506

一、過多的同步會導致死鎖

二、生產者消費者模式:

生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多執行緒同步問題的經典案例。該問題描述了兩個共享固定大小緩衝區的執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。通常採用程序間通訊的方法解決該問題,常用的方法有訊號燈法等。如果解決方法不夠完善,則容易出現死鎖的情況。出現死鎖時,兩個執行緒都會陷入休眠,等待對方喚醒自己。該問題也能被推廣到多個生產者和消費者的情形。

兩種方法:

訊號燈法:

wait():等待,釋放鎖 sleep 不釋放鎖

notify()/notifyall():喚醒

與synchornized一起使用

管程法:

訊號燈法:

共同的資源:

//共同的資源

class food catch (interruptedexception e)

} //開始生產

system.out.println("生產:"+pic);

try catch (interruptedexception e)

//生產完畢

this.pic = pic;

//通知消費

this.notify();

//生產者停下

this.flag = false; }

//消費

public synchronized void customerfood() catch (interruptedexception e)

} //開始消費

try catch (interruptedexception e)

system.out.println("消費了:"+pic);

//消費完畢

//通知生產

this.notify();

//消費停止

this.flag = true;

}}

生產者:

//生產者

class producer implements runnable

@override

public void run() else

} } }

消費者:

//消費者

class customer implements runnable

@override

public void run()

} }

呼叫:

public class testpro 

}

NSCondition 多執行緒解決生產者消費者問題

import viewcontroller.h inte ce viewcontroller 資料緩衝區 property strong,nonatomic nsmutablearray products 執行緒鎖 property strong,nonatomic nscondition cond...

Java多執行緒學習之生產者消費者問題(一)

生產者消費者問提 為使達到生產乙個消費乙個的目的,使用等待喚醒機制 wait 該方法可以讓執行緒處於凍結狀態,並將執行緒儲存到執行緒池中 notify 喚醒指定執行緒池中的任意乙個執行緒 notifyall 喚醒指定執行緒池中的所有執行緒 這些方法必須使用在同步中,因為它們用來操作同步鎖上的執行緒狀...

java執行緒 生產者與消費者

package h public class test 倉庫 class godown godown int curnum 生產指定數量的產品 param neednum public synchronized void produce int neednum catch interruptedex...