




已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Monitor Object設(shè)計(jì)模式入手 探索Java同步機(jī)制 二,Monitor Object 設(shè)計(jì)模式 C+ 描述 我們將從以下幾個(gè)方面來討論 Monitor Object 模式。 問題描述 我們?cè)陂_發(fā)并發(fā)的應(yīng)用時(shí),經(jīng)常需要設(shè)計(jì)這樣的對(duì)象,該對(duì)象的方法會(huì)在多線程的環(huán)境下被調(diào)用,而這些方法的執(zhí)行都會(huì)改變?cè)搶?duì)象本身的狀態(tài)。為了防止競(jìng)爭(zhēng)條件 (race condition) 的出現(xiàn),對(duì)于這類對(duì)象的設(shè)計(jì),需要考慮解決以下問題: 在任一時(shí)間內(nèi),只有唯一的公共的成員方法,被唯一的線程所執(zhí)行。 對(duì)于對(duì)象的調(diào)用者來說,如果總是需要在調(diào)用方法之前進(jìn)行拿鎖,而在調(diào)用方法之后進(jìn)行放鎖,這將會(huì)使并發(fā)應(yīng)用編程變得更加困難。合理的設(shè)計(jì)是,該對(duì)象本身確保任何針對(duì)它的方法請(qǐng)求的同步被透明的進(jìn)行,而不需要調(diào)用者的介入。,如果一個(gè)對(duì)象的方法執(zhí)行過程中,由于某些條件不能滿足而阻塞,應(yīng)該允許其它的客戶端線程的方法調(diào)用可以訪問該對(duì)象。 我們使用 Monitor Object 設(shè)計(jì)模式來解決這類問題:將被客戶線程并發(fā)訪問的對(duì)象定義為一個(gè) monitor 對(duì)象。客戶線程僅僅通過 monitor 對(duì)象的同步方法才能使用 monitor 對(duì)象定義的服務(wù)。為了防止陷入競(jìng)爭(zhēng)條件,在任一時(shí)刻只能有一個(gè)同步方法被執(zhí)行。每一個(gè) monitor 對(duì)象包含一個(gè) monitor 鎖,被同步方法用于串行訪問對(duì)象的行為和狀態(tài)。此外,同步方法可以根據(jù)一個(gè)或多個(gè)與 monitor 對(duì)象相關(guān)的 monitor conditions 來決定在何種情況下掛起或恢復(fù)他們的執(zhí)行。,結(jié)構(gòu) 在 Monitor Object 模式中,主要有四種類型的參與者: 監(jiān)視者對(duì)象 (Monitor Object): 負(fù)責(zé)定義公共的接口方法,這些公共的接口方法會(huì)在多線程的環(huán)境下被調(diào)用執(zhí)行。 同步方法:這些方法是監(jiān)視者對(duì)象所定義。為了防止競(jìng)爭(zhēng)條件,無論是否同時(shí)有多個(gè)線程并發(fā)調(diào)用同步方法,還是監(jiān)視者對(duì)象含有多個(gè)同步方法,在任一時(shí)間內(nèi)只有監(jiān)視者對(duì)象的一個(gè)同步方法能夠被執(zhí)行。 監(jiān)視鎖 (Monitor Lock): 每一個(gè)監(jiān)視者對(duì)象都會(huì)擁有一把監(jiān)視鎖。 監(jiān)視條件 (Monitor Condition): 同步方法使用監(jiān)視鎖和監(jiān)視條件來決定方法是否需要阻塞或重新執(zhí)行。,執(zhí)行序列圖 在監(jiān)視者對(duì)象模式中,在參與者之間將發(fā)生如下的協(xié)作過程: 1、同步方法的調(diào)用和串行化。當(dāng)客戶線程調(diào)用監(jiān)視者對(duì)象的同步方法時(shí),必須首先獲取它的監(jiān)視鎖。只要該監(jiān)視者對(duì)象有其他同步方法正在被執(zhí)行,獲取操作便不會(huì)成功。在這種情況下,客戶線程將被阻塞直到它獲取監(jiān)視鎖。當(dāng)客戶線程成功獲取監(jiān)視鎖后,進(jìn)入臨界區(qū),執(zhí)行方法實(shí)現(xiàn)的服務(wù)。一旦同步方法完成執(zhí)行,監(jiān)視鎖會(huì)被自動(dòng)釋放,目的是使其他客戶線程有機(jī)會(huì)調(diào)用執(zhí)行該監(jiān)視者對(duì)象的同步方法。 2、同步方法線程掛起。如果調(diào)用同步方法的客戶線程必須被阻塞或是有其他原因不能立刻進(jìn)行,它能夠在一個(gè)監(jiān)視條件上等待,這將導(dǎo)致該客戶線程暫時(shí)釋放監(jiān)視鎖,并被掛起在監(jiān)視條件上。,3、監(jiān)視條件通知。一個(gè)客戶線程能夠通知一個(gè)監(jiān)視條件,目的是為了讓一個(gè)前期使自己掛起在一個(gè)監(jiān)視條件上的同步方法線程恢復(fù)運(yùn)行。 4、同步方法線程恢復(fù)。一旦一個(gè)早先被掛起在監(jiān)視條件上的同步方法線程獲取通知,它將繼續(xù)在最初的等待監(jiān)視條件的點(diǎn)上執(zhí)行。在被通知線程被允許恢復(fù)執(zhí)行同步方法之前,監(jiān)視鎖將自動(dòng)被獲取。圖 1 描述了監(jiān)視者對(duì)象的動(dòng)態(tài)特性。,示例 在本節(jié)中,我們將使用監(jiān)視者對(duì)象設(shè)計(jì)模式來解決一個(gè)實(shí)際的問題。 這是一個(gè)典型的生產(chǎn)者 / 消費(fèi)者模式問題。假定我們有一個(gè)固定長(zhǎng)度的消息隊(duì)列,該隊(duì)列會(huì)被多個(gè)生產(chǎn)者 / 消費(fèi)者線程所操作,生產(chǎn)者線程負(fù)責(zé)將消息放入該隊(duì)列,而消費(fèi)者線程負(fù)責(zé)從該對(duì)列中取出消息。 清單 6. Message_Queue.h class Message_Queue public: enum MAX_MESSAGES = 100/* . */ ; / The constructor defines the maximum number / of messages in the queue. This determines when the queue is full. Message_Queue(size_t max_messages = MAX_MESSAGES); virtual Message_Queue();,/ Put the at the tail of the queue. / If the queue is full, block until the queue is not full. /* synchronized */ void put (const Message ,private: / Put the at the tail of the queue, and / get the at its head, respectively. / Note that, the internal methods are not synchronized. void put_i (const Message ,/ The maximum number s that can be / in a queue before its considered full. size_t max_messages_; / Monitor lock that protects the queues / internal state from race conditions during concurrent access. mutable Thread_Mutex monitor_lock_; / Condition variable used in conjunction with to make / synchronized method threads wait until the queue is no longer empty. Thread_Condition not_empty_; / Condition variable used in conjunction with to make / synchronized method threads wait until the queue is no longer full. Thread_Condition not_full_; ;,清單 7. Message_Queue.cpp #include “Message_Queue.h“ Message_Queue:Message_Queue (size_t max_messages) :not_full_(monitor_lock_), not_empty_(monitor_lock_), max_messages_(max_messages), message_count_(0) bool Message_Queue:empty () const Guard guard (monitor_lock_); return empty_i (); bool Message_Queue:full () const,Guard guard (monitor_lock_); return full_i (); void Message_Queue:put (const Message ,/ Enqueue the at the tail. put_i (msg); / Notify any thread waiting in that the queue has at least one . not_empty_.notify (); / Destructor of releases . Message Message_Queue:get () / Use the Scoped Locking idiom to acquire/release the upon / entry/exit to the synchronized method. Guard guard (monitor_lock_); / Wait while the queue is empty. while (empty_i () / Release and suspend the / calling thread waiting for a new to / be put into the queue. The is / reacquired automatically when returns. not_empty_.wait (); ,/ Dequeue the first in the queue and update the . Message m = get_i (); / Notify any thread waiting in that the / queue has room for at least one . not_full_.notify (); return
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 面向2025年生鮮新零售行業(yè)供應(yīng)鏈優(yōu)化與冷鏈物流創(chuàng)新實(shí)踐研究報(bào)告001
- 基層醫(yī)療機(jī)構(gòu)信息化建設(shè)中的基層衛(wèi)生人才隊(duì)伍信息化能力提升報(bào)告
- 2025年醫(yī)院信息化建設(shè)電子病歷系統(tǒng)優(yōu)化策略研究報(bào)告001
- 2025年醫(yī)院電子病歷系統(tǒng)優(yōu)化與醫(yī)療信息化產(chǎn)業(yè)生態(tài)協(xié)同創(chuàng)新模式實(shí)踐報(bào)告
- 2025年醫(yī)院電子病歷系統(tǒng)功能優(yōu)化及用戶體驗(yàn)提升報(bào)告001
- 2025年醫(yī)藥市場(chǎng)前景展望:仿制藥一致性評(píng)價(jià)下的產(chǎn)業(yè)升級(jí)路徑
- 咖啡連鎖品牌2025年市場(chǎng)布局:咖啡店品牌戰(zhàn)略規(guī)劃與市場(chǎng)研究報(bào)告
- 醫(yī)療器械臨床試驗(yàn)質(zhì)量管理規(guī)范化2025年實(shí)施現(xiàn)狀報(bào)告
- 2025年醫(yī)藥企業(yè)研發(fā)外包(CRO)模式下的創(chuàng)新項(xiàng)目管理報(bào)告
- 數(shù)字孿生視角下2025年城市規(guī)劃與建設(shè)中的智慧城市交通流量管理優(yōu)化與評(píng)估報(bào)告
- 肢體離斷傷的護(hù)理
- 2024年中國黑龍江省農(nóng)藥市場(chǎng)調(diào)查報(bào)告
- LINE6效果器HD300中文說明書
- 浙江省強(qiáng)基聯(lián)盟學(xué)考模擬2024-2025學(xué)年高二下學(xué)期6月學(xué)考模擬地理試題(含答案)
- 中國美術(shù)學(xué)院非教學(xué)崗位招聘筆試真題2024
- 外賣餐飲平臺(tái)管理制度
- 人形機(jī)器人深度研究系列八:諧波減速器:差齒傳動(dòng)持續(xù)進(jìn)化
- 公立醫(yī)院風(fēng)險(xiǎn)評(píng)估報(bào)告
- 腫瘤婦科進(jìn)修匯報(bào)
- 工程機(jī)械銷售基本知識(shí).ppt
- 供應(yīng)商入庫協(xié)議
評(píng)論
0/150
提交評(píng)論