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