1. 程式人生 > 程式設計 >設計模式-生產者 消費者

設計模式-生產者 消費者

定義

//維基百科
生產者消費者問題
說明
生產者消費者問題,也稱有限緩衝問題,是一個多程式同步問題的經典案例。該問題描述了共享固定大小緩衝區的兩個程式——即所謂的“生產者”和“消費者”——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。


就是兩個程式,共享同一個資料。正如,上面所說,共享固定大小緩衝區的兩個程式。這兩個程式,就是,一個是生產者,一個是消費者。一個寫資料,一個讀資料。

應用場景-支付系統:支付

目的是為瞭解耦。因為支付的流程是這樣的:
1.掃本地資料 //從資料庫,讀資料。
寫到佇列
2.處理本地資料 //寫資料到資料庫。更新支付狀態。
從佇列讀

現在呢,把1 2分開了。即,把讀資料,放到一個獨立的服務,去處理。讀資料庫和寫資料庫,分離。//從資料庫的讀寫的角度,進行解耦

寫佇列和讀佇列,分離。//從集合資料的讀寫的角度,進行解耦

資料結構-佇列ConcurrentLinkedQueue

解釋
1.佇列 //因為資料處理是按照順序,具體是先進先出的順序,所以用佇列。只要是對資料進出的順序有要求的,都是用佇列。

2.連結串列 //是因為資料量比較大。最佳實踐,一般來說實現佇列資料結構的基礎資料結構就是用連結串列。當然,陣列也可以實現佇列。

所以,支付系統裡,用到的都是連結串列佇列。比如,併發連結串列佇列(支付)。連結串列阻塞佇列(實名認證)。連結串列阻塞佇列(轉賬),因為執行緒池預設就是連結串列阻塞佇列。

可以看到,全部是連結串列佇列。其他的,就是是否是阻塞佇列,是否是執行緒安全。

3.執行緒安全

和觀察者模式的區別?

生產者 消費者。和觀察者 被觀察者,基本上一樣。就是一個提供資料,一個消費資料。

消費資料的人在監聽資料。提供資料的人在生產資料,並且生產資料之後,還要通知消費者。

程式碼

1.生產者程式 //寫資料到阻塞佇列。具體怎麼寫?呼叫遠端服務(即消費者進行)的方法,寫資料到佇列。佇列資料是在消費者程式裡。

2.消費者程式 //遍歷佇列資料。具體是while迴圈遍歷。具體是:

for(佇列不為空){
    讀佇列資料;
}
複製程式碼

兩個程式和兩個執行緒

一般來說,執行緒,也就是生產者執行緒和消費者執行緒在同一個程式/jvm內,就是阻塞佇列 + while(true)。

for(true){
    阻塞讀阻塞佇列資料;
}
複製程式碼

當然,寫也一樣,阻塞寫阻塞佇列資料。


但是,如果是兩個程式,生產者程式和消費者程式。那麼就是定時任務 + 非阻塞佇列 + while(佇列大小)。

也就是說,是通過定時任務,來實現不停的處理資料的功能的。而兩個執行緒是通過while(true),來實現不停的處理新到來的資料。

參考

zh.wikipedia.org/wiki/生產者消費者…

juejin.im/entry/59634…

juejin.im/post/5aeec6…

www.infoq.cn/article/pro…

這些文章都很簡單,僅供參考