摘要:一簡(jiǎn)介多線程環(huán)境下,我們經(jīng)常需要多個(gè)線程的并發(fā)和協(xié)作。這個(gè)時(shí)候,就需要了解一個(gè)重要的多線程并發(fā)協(xié)作模型生產(chǎn)者消費(fèi)者模式。對(duì)于生產(chǎn)者沒(méi)有生產(chǎn)產(chǎn)品之前,消費(fèi)者要進(jìn)入等待狀態(tài)。分析不足在生產(chǎn)者消費(fèi)者問(wèn)題中,僅有是不夠的。
一、簡(jiǎn)介
多線程環(huán)境下,我們經(jīng)常需要多個(gè)線程的并發(fā)和協(xié)作。
這個(gè)時(shí)候,就需要了解一個(gè)重要的多線程并發(fā)協(xié)作模型 "生產(chǎn)者 / 消費(fèi)者模式 "。
模式簡(jiǎn)圖
生產(chǎn)者:負(fù)責(zé)生產(chǎn)數(shù)據(jù)的模塊(模塊可能是:方法、對(duì)象、線程、進(jìn)程)。
消費(fèi)者:是負(fù)責(zé)處理數(shù)據(jù)的模塊(模塊可能是:方法、對(duì)象、線程、進(jìn)程)。
緩沖區(qū): 消費(fèi)者不能直接使用生產(chǎn)者的數(shù)據(jù),它們之間有個(gè)“緩沖區(qū)”。
緩沖區(qū)是實(shí)現(xiàn)并發(fā)的核心
生產(chǎn)者將生產(chǎn)好的數(shù)據(jù)放入“緩沖區(qū)”
消費(fèi)者從“緩沖區(qū)”拿要處理的數(shù)據(jù)。
二、優(yōu)點(diǎn)2.1 解耦
2.1.1 耦合:如果生產(chǎn)者直接調(diào)用消費(fèi)者的某個(gè)方法,生產(chǎn)者則對(duì)消費(fèi)者產(chǎn)生依賴
生活寄郵件例子:
@寄件人(生產(chǎn)者)
@郵筒(緩沖區(qū))
@收件人(消費(fèi)者)
寄件人如果不使用郵箱,ta必須得把信直接交給郵遞員(某個(gè)方法),才能送到收件人,這就產(chǎn)生你和郵遞員之間的依賴
2.1.2 解耦:生產(chǎn)者不需要和消費(fèi)者直接打交道。
2.2 支持并發(fā)(concurrency)
2.2.1 緩沖區(qū)的優(yōu)點(diǎn):
對(duì)于生產(chǎn)者:生產(chǎn)者線程只需要往緩沖區(qū)里面放置數(shù)據(jù),無(wú)需管消費(fèi)者消費(fèi)的情況。
對(duì)于消費(fèi)者:消費(fèi)者只需從緩沖區(qū)拿數(shù)據(jù)處理,無(wú)需管生產(chǎn)者生產(chǎn)的情況
2.3 解決忙閑不均,提高效率對(duì)于消費(fèi)者:當(dāng)生產(chǎn)者生產(chǎn)數(shù)據(jù)緩慢時(shí),緩沖區(qū)仍有數(shù)據(jù),不影響消費(fèi)者消費(fèi)
對(duì)于生產(chǎn)者:消費(fèi)者處理數(shù)據(jù)慢時(shí),生產(chǎn)者仍然可以繼續(xù)往緩沖區(qū)里面放置數(shù)據(jù) 。
三、應(yīng)用場(chǎng)景
線程并發(fā)協(xié)作(也叫線程通信),通常用于生產(chǎn)者/消費(fèi)者模式,情景如下:
共享資源:生產(chǎn)者和消費(fèi)者共享同一個(gè)資源,并且生產(chǎn)者和消費(fèi)者之間相互依賴,互為條件。
對(duì)于生產(chǎn)者:沒(méi)有生產(chǎn)產(chǎn)品之前,消費(fèi)者要進(jìn)入等待狀態(tài)。而生產(chǎn)了產(chǎn)品之后,又需要馬上通知消費(fèi)者消費(fèi)。
對(duì)于消費(fèi)者:在消費(fèi)之后,要通知生產(chǎn)者已經(jīng)消費(fèi)結(jié)束,需要繼續(xù)生產(chǎn)新產(chǎn)品以供消費(fèi)。
分析不足:在生產(chǎn)者消費(fèi)者問(wèn)題中,僅有synchronized是不夠的。
synchronized可阻止并發(fā)更新同一個(gè)共享資源,實(shí)現(xiàn)了同步;
synchronized不能用來(lái)實(shí)現(xiàn)不同線程之間的消息傳遞(通信)
實(shí)現(xiàn)需要的主要方法:
“架構(gòu)設(shè)計(jì)”中,會(huì)大量使用這個(gè)模式。暫時(shí)作為了解
四、總結(jié)
略
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/75589.html
摘要:程序執(zhí)行時(shí),至少會(huì)有一個(gè)線程在運(yùn)行,這個(gè)運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個(gè)線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會(huì)拋出異常。 線程 我們?cè)陂喿x程序時(shí),表面看來(lái)是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個(gè)時(shí)間點(diǎn)執(zhí)行的處理只有一個(gè)。 Java 程序執(zhí)行時(shí),至少會(huì)有一個(gè)線程在運(yùn)行...
摘要:生產(chǎn)者消費(fèi)者模式是一個(gè)經(jīng)典的多線程設(shè)計(jì)模式,它為多線程的協(xié)作提供了良好的解決方案。生產(chǎn)者消費(fèi)者模式中的內(nèi)存緩沖區(qū)的主要功能是數(shù)據(jù)在多線程間的共享。 生產(chǎn)者-消費(fèi)者模式是一個(gè)經(jīng)典的多線程設(shè)計(jì)模式,它為多線程的協(xié)作提供了良好的解決方案。在生產(chǎn)者-消費(fèi)者模式中,通常有兩類線程,即若干個(gè)生產(chǎn)者線程和若干個(gè)消費(fèi)者線程。生產(chǎn)者線程負(fù)責(zé)提交用戶請(qǐng)求,消費(fèi)者線程負(fù)責(zé)處理用戶請(qǐng)求。生產(chǎn)者和消費(fèi)者之間通過(guò)...
摘要:在生產(chǎn)者與消費(fèi)者之間的緩沖區(qū)稱之為倉(cāng)庫(kù)。生產(chǎn)者負(fù)責(zé)往倉(cāng)庫(kù)運(yùn)輸商品,而消費(fèi)者負(fù)責(zé)從倉(cāng)庫(kù)里取出商品,這就構(gòu)成了生產(chǎn)者消費(fèi)者模式。中的多線程編程在實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式之前,我們先學(xué)習(xí)下中的多線程編程。 什么是生產(chǎn)者消費(fèi)者模式 在軟件開(kāi)發(fā)的過(guò)程中,經(jīng)常碰到這樣的場(chǎng)景:某些模塊負(fù)責(zé)生產(chǎn)數(shù)據(jù),這些數(shù)據(jù)由其他模塊來(lái)負(fù)責(zé)處理(此處的模塊可能是:函數(shù)、線程、進(jìn)程等)。產(chǎn)生數(shù)據(jù)的模塊稱為生產(chǎn)者,而處理數(shù)據(jù)...
摘要:本文探討并發(fā)中的其它問(wèn)題線程安全可見(jiàn)性活躍性等等。當(dāng)閉鎖到達(dá)結(jié)束狀態(tài)時(shí),門打開(kāi)并允許所有線程通過(guò)。在從返回時(shí)被叫醒時(shí),線程被放入鎖池,與其他線程競(jìng)爭(zhēng)重新獲得鎖。 本文探討Java并發(fā)中的其它問(wèn)題:線程安全、可見(jiàn)性、活躍性等等。 在行文之前,我想先推薦以下兩份資料,質(zhì)量很高:極客學(xué)院-Java并發(fā)編程讀書(shū)筆記-《Java并發(fā)編程實(shí)戰(zhàn)》 線程安全 《Java并發(fā)編程實(shí)戰(zhàn)》中提到了太多的術(shù)語(yǔ)...
閱讀 4172·2021-11-22 13:52
閱讀 2089·2021-09-22 15:12
閱讀 1128·2019-08-30 15:53
閱讀 3464·2019-08-29 17:12
閱讀 2197·2019-08-29 16:23
閱讀 1661·2019-08-26 13:56
閱讀 1778·2019-08-26 13:44
閱讀 1896·2019-08-26 11:56