Java 執行緒與併發研究系列五 生產者與消費者

2021-06-22 20:23:26 字數 1497 閱讀 3900

生產者與消費者問題是了解多執行緒的基本例項,就像hello world之於語言學習,下面我們就編寫乙個生產者-消費者的示例

public class test 

try catch (interruptedexception e)

exes.shutdownnow(); }}

class producer implements runnable

@override

public void run() catch (interruptedexception e) }}

class consumer implements runnable

@override

public void run() catch (interruptedexception e)

} }class storage

public synchronized void produce()throws interruptedexception

num+=5;

system.out.println("生產產品數:"+5+" 倉庫還剩產品數:"+num);

notifyall(); }

public synchronized void consume()throws interruptedexception

num-=7;

system.out.println("消費產品數:"+7+" 倉庫還剩產品數:"+num);

notifyall();

}}

以上是通過wait()和notifyall synchronized關鍵字進行執行緒之間的同步,現在我們嘗試另外一種方法,通過使用同步佇列來解決任務的協作

問題,如果消費者試圖從佇列中獲取物件,而此時隊列為空,阻塞佇列就會掛起消費者執行緒,同理如果參考已經滿了,生產者試圖向佇列

中新增物件,此時佇列將掛起生產者執行緒。

public class mydata

try catch (interruptedexception e)

exes.shutdownnow();

system.out.println("倉庫最後剩餘數:"+storage.queue.size()); }}

class producer implements runnable

@override

public void run() catch (interruptedexception e) }}

class consumer implements runnable

@override

public void run() catch (interruptedexception e)

} }class storage

public void produce()throws interruptedexception }}

class product

}

多執行緒 Java多執行緒與併發

實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...

Java多執行緒與併發 Java鎖

累嗎?累就對了,說明你還活著 公平鎖 是指多個執行緒按照申請鎖的順序來獲取鎖,類似排隊打飯,先來後到。非公平鎖 是指多個執行緒獲取鎖的順序並不是按照申請鎖的順序,有可能後申請的執行緒比先申請的執行緒優先獲取鎖。在高併發的情況下,有可能會造成優先順序反轉或者飢餓現象 並發包中reentrantlock...

Java併發系列五 深入理解volatile關鍵字

instance new instancce instance是volatile變數 這個寫回記憶體的操作會使得其他cpu裡快取了該記憶體位址的資料無效 乙個處理器的快取回寫到記憶體會導致其他處理器的快取失效 當處理器發現本地快取失效後,就會從記憶體中重讀該變數資料,即可以獲取當前最新值。publi...