帶你輕松理解生產(chǎn)者消費者模型!生產(chǎn)者消費者模型可以說是同步與互斥最典型的應用場景了!文末附有模型簡單實現(xiàn)的代碼,若有疑問可私信一起討論。
一:為什么要使用生產(chǎn)者消費者模型?
生產(chǎn)者消費者模式就是通過一個容器來解決生產(chǎn)者和消費者的強耦合問題。生產(chǎn)者和消費者彼此之間不直接通訊,而通過中間容器(阻塞隊列,環(huán)形隊列等)來進行通訊,所以生產(chǎn)者生產(chǎn)完數(shù)據(jù)之后不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產(chǎn)者要數(shù)據(jù),而是直接從阻塞隊列里取,阻塞隊列就相當于一個緩沖區(qū),平衡了生產(chǎn)者和消費者的處理能力。這個阻塞隊列就是用來給生產(chǎn)者和消費者解耦的。
二:生產(chǎn)者消費者模型的優(yōu)點
- 解耦
- 支持并發(fā)
- 支持忙閑不均
??此處的并發(fā)并不是在臨界區(qū)中并發(fā),而是說生產(chǎn)時和消費時各自執(zhí)行(即消費任務的同時也在制作任務),實現(xiàn)并發(fā)!
??此處的忙閑不均體現(xiàn)在制作任務和消費任務的花費時間不同。
三:基于阻塞隊列的生產(chǎn)者和消費者之間的關系
同步:當隊列為空時,消費者只有阻塞等待生產(chǎn)者生產(chǎn)之后才可被喚醒繼續(xù)消費。當隊列為滿時,生產(chǎn)者只有阻塞等待消費者消費后才可被喚醒繼續(xù)生產(chǎn)。
互斥:體現(xiàn)在生產(chǎn)者與生產(chǎn)者,消費者與消費者之間,同一時刻只允許一個執(zhí)行流進入臨界區(qū)訪問臨界資源。生產(chǎn)者與消費者之間在隊列為滿或者為空時也有體現(xiàn)互斥性,同一時刻只允許一方訪問臨界資源。文章來源:http://www.zghlxwxcb.cn/news/detail-415988.html
四:基于BlockingQueue的生產(chǎn)者消費者模型
在多線程編程中阻塞隊列(Blocking Queue)是一種常用于實現(xiàn)生產(chǎn)者和消費者模型的數(shù)據(jù)結構。其與普通的隊列區(qū)別在于,當隊列為空時,從隊列獲取元素的操作將會被阻塞,直到隊列中被放入了元素;當隊列滿時,往隊列里存放元素的操作也會被阻塞,直到有元素被從隊列中取出(以上的操作都是基于不同的線程來說的,線程在對阻塞隊列進程操作時會被阻塞)
示例代碼:基于阻塞隊列的生產(chǎn)者消費者模型代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-415988.html
到了這里,關于【設計模式】生產(chǎn)者消費者模型的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!