【設計模式】JAVA Design Patterns——Monitor(監視器模式)

🔍目的


主要目的是為多個線程或進程提供一種結構化和受控的方式來安全地訪問和操作共享資源,例如變量、數據結構或代碼的關鍵部分,而不會導致沖突或競爭條件。

🔍解釋


通俗描述

監視器模式用于強制對數據進行單線程訪問。 一次只允許一個線程在監視器對象內執行代碼。

維基百科

在并發編程(也稱為并行編程)中,監視器是一種同步構造,它允許線程具有互斥性和等待(阻止)特定條件變為假的能力。 監視器還具有向其他線程發出信號通知其條件已滿足的機制。

程序示例

考慮有一家銀行通過轉賬方式將錢從一個帳戶轉移到另一個帳戶。 它是同步意味著只有一個線程可以訪問此方法,因為如果許多線程訪問它并在同一時間將資金從一個帳戶轉移到另一個帳戶,則余額會發生變化!

class Bank {private int[] accounts;Logger logger;public Bank(int accountNum, int baseAmount, Logger logger) {this.logger = logger;accounts = new int[accountNum];Arrays.fill(accounts, baseAmount);}public synchronized void transfer(int accountA, int accountB, int amount) {if (accounts[accountA] >= amount) {accounts[accountB] += amount;accounts[accountA] -= amount;logger.info("Transferred from account :" + accountA + " to account :" + accountB + " , amount :" + amount + " . balance :" + getBalance());}}

getBalance 始終返回總金額,并且每次轉賬后總金額應相同?

     private synchronized int getBalance() {int balance = 0;for (int account : accounts) {balance += account;}return balance;}}

🔍類圖


🔍適用場景

監視器設計模式應該用于具有需要由多個線程或進程同時訪問和操作的共享資源的情況。 此模式在需要同步以防止競爭條件、數據損壞和不一致狀態的情況下特別有用。 以下是您應該考慮使用監視器模式的一些情況:

  1. 共享數據:當您的應用程序涉及需要由多個線程訪問和更新的共享數據結構、變量或資源時。 監視器確保一次只有一個線程可以訪問共享資源,從而防止沖突并確保數據一致性。

  2. 關鍵部分:當您有代碼的關鍵部分一次只需要由一個線程執行時。 關鍵部分是操作共享資源的代碼部分,并發訪問可能會導致問題。 監視器有助于確保在任何給定時間只有一個線程可以執行關鍵部分。

  3. 線程安全:當您需要確保線程安全而不是僅僅依賴鎖和信號量等低級同步機制時。 監視器提供了封裝同步和資源管理的更高級別的抽象。

  4. 等待和發信號:當您遇到線程需要等待滿足某些條件才能繼續操作時。 監視器通常包含線程等待特定條件以及其他線程在滿足條件時通知它們的機制。

  5. 死鎖預防:當您希望通過提供結構化方式來獲取和釋放共享資源上的鎖來防止死鎖時。 監視器通過確保資源訪問得到良好管理來幫助避免常見的死鎖情況。

  6. 并發數據結構:當您實現并發數據結構(例如隊列、堆棧或哈希表)時,多個線程需要操作該結構,同時保持其完整性。

  7. 資源共享:當多個線程需要共享有限的資源時,例如連接數據庫或訪問網絡套接字。 監視器可以幫助以受控方式管理這些資源的分配和釋放。

  8. 改進可維護性:當您想要將同步邏輯和共享資源管理封裝在單個對象中時,改進代碼組織并使并發相關代碼更容易推理。

🔍Ending


需要注意的是,監視器模式可能并不最適合所有并發場景。 在某些情況下,其他同步機制(例如鎖、信號量或并發數據結構)可能更合適。 此外,現代編程語言和框架通常提供更高級別的并發結構,抽象出低級別同步的復雜性。

在應用監視器模式之前,建議徹底分析應用程序的并發需求,并選擇最適合您需求的同步方法,同時考慮性能、復雜性和可用語言功能等因素。


希望本文能夠幫助讀者更深入地理解監視器模式,并在實際項目中發揮其優勢。謝謝閱讀!


希望這份博客草稿能夠幫助到你。如果有其他需要修改或添加的地方,請隨時告訴我。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21726.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21726.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21726.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows線程同步的四種方式和區別

1. Windows線程同步的四種方式 2. 區別 Critical Section更多強調的是保護,Event對象、Mutex對象與Semaphore對象更多的強調的是同步;Critical Section對象是無法設置等待超時的,而其他三個對象則可以設置等待超時,從這一點來講…

ROS2在RVIZ2中加載機器人urdf模型

參考ROS2-rviz2顯示模型 我這邊用的solid works生成的urdf以及meshes,比參考的方法多了meshes 問題一:Error retrieving file [package://rm_dcr_description/meshes/leftarm_link7.STL]: Package [rm_dcr_description] does not exist 這個是urdf模型中…

VisualStudio中:如果某個項目不顯示SVN的show log等,而其他項目都正常

VisualStudio中:如果某個項目不顯示SVN的show log等,而其他項目都正常。說明大概率是當前項目的問題,而不是VisualStudio的問題! 1.這個項目內有一個“隱藏”文件夾.svn 》先刪除! 2.如果外層文件夾有紅色感嘆號&…

2024-5-14——完成所有任務需要的最少輪數

2024-5-14 題目來源我的題解方法一 哈希表數學 題目來源 力扣每日一題;題序:2244 我的題解 方法一 哈希表數學 根據數學規律可以發現,除了只有1個任務時不能完成任務,其他的都可以完成。并且需要的輪數為: ?x/3? …

16、matlab求導、求偏導、求定積分、不定積分、數值積分和數值二重積分

1、matlab求導,diff()函數 1)一階導數 語法:diff(f(x)):求一階導數 //diff(f(x),n):求n階導數(n為具體正整數) 以函數(cos(x)+sin(x)-x^2)的一階導數為例 一階導數代碼: yms x;%聲明符號變量x f(x)=cos(x)+sin(x)-x^2;%定義原式子 dy=diff(f(x))%求一階導數dy =cos(…

機器學習-12-開源的機器學習可視化拖拉拽工具orange3的應用

參考orange3,一個無敵的 Python 庫! 參考orange3的GitHub地址 參考orange3的官方應用示例 參考下載Orange模塊,總是出錯? 參考Orange3入門(Orange3Dev) 參考工具|Orange 3:機器學習入門神器 1 orange3 數據科學和機器學習是當今科技領域的重要組成部分,而數據分析和建…

Csv--01--ExportUtil 寫文件

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 ExportUtil案例: ExportUtil.writeCsvFile ExportUtil import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists;import org.apache…

記錄request中上傳圖片接口的測試過程

F12抓取的接口地址如下: 入參: 注意圈出來的部分參數 apifox調試接口 python相關代碼: 接口調用相關文件: select_photo.py 輸出結果: 相關接口的一些封裝:

Window 批量改文件后綴,例如,test.xls文件改為 test.csv;或者sas 文件改 sql 文件

echo off setlocal enabledelayedexpansion :: 設置需要遍歷的文件夾路徑 set "folderPathD:\test" ::遍歷文件夾內所有文件夾 for /d %%i in("folderPath%\*") do( echo Processing folder: %%i ::遍歷當前文件夾內所有.sas文件 for %%j in ("%%i\*…

【一百零三】【算法分析與設計】并查集,并查集的實現,P3367 【模板】并查集

并查集的實現 描述 給定一個沒有重復值的整形數組arr,初始時認為arr中每一個數各自都是一個單獨的集合。請設計一種叫UnionFind的結構,并提供以下兩個操作。 boolean isSameSet(int a, int b): 查詢a和b這兩個數是否屬于一個集合 void union(int a, int …

K210視覺識別模塊學習筆記2:固件的下載升級_官方數字識別例程導入方法

今日開始學習K210視覺識別模塊:固件的下載升級_官方數字識別例程導入方法 主要學習如何升級固件庫,在哪下載固件庫,以及如何在TF卡正確導入官方例程: 亞博智能的K210視覺識別模塊...... 固件庫版本: canmv_yahboom_v2.1.1.bin 本次最終目…

醫學數據屬于小樣本,或許源于資源不對等|羅小羅·說

小羅碎碎念 醫學數據屬于小樣本,或許源于資源不對等 今天這篇推文,源于一場對話。 我和他(粉絲)聊完以后,覺得心里總是壓了點什么東西,直到我寫完那篇關于醫學數據類別不平衡的文章,我才大致理…

SEO之關鍵詞擴展(一)

初創企業搭建網站的朋友看1號文章;想學習云計算,怎么入門看2號文章謝謝支持: 1、我給不會敲代碼又想搭建網站的人建議2、新手上云 確定了核心關鍵詞后,接下來就是進行關鍵詞擴展。對一個稍有規模的網站來說,研究幾十個…

Java設計模式 _行為型模式_狀態模式

一、狀態模式 1、狀態模式 狀態模式(State Pattern)是一種行為型模式。 它允許一個對象在其內部狀態改變時改變它的行為。狀態模式把所研究的對象的行為包裝在不同的狀態對象里,每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖…

【Python Cookbook】S01E13 篩選序列中的元素

目錄 問題解決方案討論 問題 序列中包含一些數據,我們需要提取出其中的值或根據某些標準對序列做刪減。 解決方案 要篩選序列中的元素,通常最簡單的辦法是通過 列表推導式,例如: mylist [1, 4, -5, 10, -7, 2, 3, -1]print([…

JAVAEE之文件IO_數據流概念,字節流:InputStream、OutputStream,字符流:reader、writer,及實例代碼

什么是數據流 顧名思義,I 表示input,O 表示output,也就是輸入輸出流,主要是在程序與文件之間,用于傳輸數據的通道。既然要傳輸數據,那么我們需要理解文件和程序之間哪種方向的傳輸是輸入流,哪種…

SD-WAN供應商的類型及選擇指南

在企業加速數字化轉型的背景下,SD-WAN技術成為優化網絡性能和提升連接效率的重要方案,受到了廣泛關注。本文將介紹當前主要的SD-WAN供應商類型及其特點,并提供企業選擇合適供應商的建議。 目前,市場上的SD-WAN供應商主要分為兩類&…

操作系統(3) 處理機調度

目錄 一、處理機調度概述 1.基本準則 (1)CPU利用率 (2)系統吞吐量 (3)周轉時間 (4)等待時間 (5)響應時間 2.進程調度方式 (1&#xff0…

現代密碼學-數字簽名

從消息認證碼到數字簽名 前面講到,消息認證碼無法防止否認,A,B之間共享密鑰計算出MAC,A,B都能計算出MAC,對于第三方C來說,他無法證明這個MAC是A計算的還是B計算的。 通過數字簽名解決問題。 A,B各自使用不同的密鑰-公鑰密碼,A用…

LeetCode刷題之HOT100之組合總和

2024/6/3 周一,工作日的第一天。昨晚夢到被導師說去實驗室不積極哈哈哈,風扇開到二級,早上被吹醒。買的書馬上快要到了。上午剛來準備刷題,結果去搞了一下數據庫sql,做的差不多了,還差點格式轉換就差不多出…