一、過多的同步會導致死鎖
二、生產者消費者模式:
生產者消費者問題(英語: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...