Google Guava –與Monitor同步

Google Guava項目是每個Java開發人員都應該熟悉的庫的集合。 Guava庫涵蓋I / O,集合,字符串操作和并發性。 在這篇文章中,我將介紹Monitor類。 Monitor是一種同步構造,可以在使用ReentrantLock的任何地方使用。 在任何時候,只有一個線程可以占用一個監視器。 Monitor類具有進入離開操作,這些操作在語義上與ReentrantLock中的鎖定解鎖操作相同。 此外,監視器支持在布爾條件下等待。
比較Monitor和ReentrantLock

對于初學者,將Monitor和ReentrantLock進行并排比較會很有幫助。

public class ReentrantLockSample {private List<String> list = new ArrayList<String>();private static final int MAX_SIZE = 10;private ReentrantLock rLock = new ReentrantLock();private Condition listAtCapacity = rLock.newCondition();public void addToList(String item) throws InterruptedException {rLock.lock();try {while (list.size() == MAX_SIZE) {listAtCapacity.await();}list.add(item);} finally {rLock.unlock();}}
}

public class MonitorSample {private List<String> list = new ArrayList<String>();private static final int MAX_SIZE = 10;private Monitor monitor = new Monitor();private Monitor.Guard listBelowCapacity = new Monitor.Guard(monitor) {@Overridepublic boolean isSatisfied() {return (list.size() < MAX_SIZE);}};public void addToList(String item) throws InterruptedException {monitor.enterWhen(listBelowCapacity);try {list.add(item);} finally {monitor.leave();}}
}

從示例中可以看到,兩者實際上具有相同數量的代碼行。 與ReentrantLock Condition相比, Monitor會在Guard對象周圍增加一些復雜性。 但是, Monitor addToList方法的清晰度遠遠不能彌補。 這可能只是我的個人喜好,但我一直發現

while(something==true){condition.await()
}

有點尷尬。

使用指南

應當注意,返回void enter方法應始終采用以下形式:

monitor.enter()
try{...work..
}finally{monitor.leave();
}

enter返回boolean方法應類似于:

if(monitor.enterIf(guard)){try{...work..}finally{monitor.leave();}
}else{.. monitor not available..
}


布爾條件

Monitor類上的enter方法太多,無法有效地完成一篇文章,所以我將挑選我的前三名,然后按照從最小阻塞到最大阻塞的順序進行介紹。

    1. tryEnterIf –線程將不等待進入監視器,僅在保護條件返回true時才進入。
    2. enterIf –線程將等待進入監視器,但前提是保護條件返回true。 還有enterIf方法簽名,這些簽名允許指定超時以及enterIfInterruptible版本。
    3. enterWhen –線程將無限期等待監視器條件返回true,但可以被中斷。 同樣,也有用于指定超時的選項以及enterWhenUniterruptible版本。


結論

我還沒有機會在工作中使用Monitor,但是我可以看到布爾保護條件的粒度有用。 我已經寫了一些基本的示例代碼和一個隨附的單元測試,以演示本文所涵蓋的一些功能。 它們在這里可用。 一如既往地歡迎您提出意見/建議。 在我的下一篇文章中,我將介紹Guava并發中的更多內容。

資源資源

    • 番石榴項目首頁
    • 監控器API
    • 樣例代碼


    參考資料: Google Guava –我們的JCG合作伙伴 Bill Bejeck在“ 隨機編碼想法”博客上與Monitor進行了同步 。

    翻譯自: https://www.javacodegeeks.com/2012/11/google-guava-synchronization-with-monitor.html

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

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

    相關文章

    yaf 重寫index.php,php框架Yaf路由重寫實例代碼

    通常為了友好的URL格式&#xff0c;會進行站點URL的重寫&#xff0c;可以在webserver(Nginx)的配置中進行rewrite&#xff0c;也可在在程序端進行&#xff0c;本文主要和大家介紹php框架Yaf路由重寫&#xff0c;給大家做個參考&#xff0c;希望能幫助到大家。以下使用Yaf框架進…

    python類初始化導入庫_Python中optparser庫用法實例詳解

    本文研究的主要是Python中optparser庫的相關內容&#xff0c;具體如下。一直以來對optparser不是特別的理解&#xff0c;今天就狠下心&#xff0c;靜下心研究了一下這個庫。當然了&#xff0c;不敢說理解的很到位&#xff0c;但是足以應付正常的使用了。廢話不多說&#xff0c;…

    SQL--Chapter8--Working with Triggers and Transactions

    Objectives:1.Implement triggers 2.Implement transactions 轉載于:https://www.cnblogs.com/Catherinezhilin/p/7979644.html

    Canvas制作的下雨動畫

    簡介 在codepen上看到一個Canvas做的下雨效果動畫&#xff0c;感覺蠻有意思的。就研究了下&#xff0c;這里來分享下&#xff0c;實現技巧。效果可以見下面的鏈接。 霓虹雨: http://codepen.io/natewiley/full/NNgqVJ/ 效果截圖&#xff1a; Canvas動畫基礎 大家都知道&…

    在Eclipse中有效使用JUnit

    最近&#xff0c;我被卷入了討論1和一些受感染的同伴2&#xff0c;他們關于我們如何在Eclipse IDE中使用JUnit 。 令人驚訝的是&#xff0c;對話帶來了并非所有人都知道的一些“技巧”。 這使我有了寫這篇文章的想法&#xff0c;總結了我們的演講。 誰知道–也許有人也有新事物…

    jquery文件上傳控件 Uploadify

    基于jquery的文件上傳控件&#xff0c;支持ajax無刷新上傳&#xff0c;多個文件同時上傳&#xff0c;上傳進行進度顯示&#xff0c;刪除已上傳文件。 要求使用jquery1.4或以上版本&#xff0c;flash player 9.0.24以上。 有兩個版本&#xff0c;一個用flash,一個是html5。html5…

    imagick php 縮放,php使用imagick模塊實現圖片縮放、裁剪、壓縮示例

    PHP 使用Imagick模塊 縮放&#xff0c;裁剪&#xff0c;壓縮圖片 包括gif圖片縮放 裁剪代碼如下:/*** 圖片裁剪* 裁剪規則&#xff1a;* 1. 高度為空或為零 按寬度縮放 高度自適應* 2. 寬度為空或為零 按高度縮放 寬度自適應* 3. 寬度&#xff0c;高度到不為空或為…

    php實現第三方郵箱登錄_PHP實現用戶異地登錄提醒功能的方法

    有時候你的網站賬號被盜或你在別處登錄操作后臺時&#xff0c;右下角會彈出提示信息&#xff0c;提醒你的賬號異地登錄&#xff0c;或者會被強制下線。對于這種安全性要求比較高的web網站&#xff0c;很多后臺管理都會做這種功能提醒。甄別自己的賬號是否被盜或者是否有另一個人…

    課時47.datalist標簽(了解)

    1.datalist標簽 作用&#xff1a;給輸入框綁定待選項 2.datalist格式&#xff1a; <datalist> <option>待選項內容</option> </datalist> 3.如何給輸入框綁定待選列表&#xff1f; 搞一個輸入框搞一個datalist列表給datalist列表標簽添加一個id給…

    pandas.read_csv參數詳解

    讀取CSV&#xff08;逗號分割&#xff09;文件到DataFrame也支持文件的部分導入和選擇迭代更多幫助參見&#xff1a;http://pandas.pydata.org/pandas-docs/stable/io.html參數&#xff1a;filepath_or_buffer : str&#xff0c;pathlib。str, pathlib.Path, py._path.local.Lo…

    Gradle – Maven的觀點

    正如我博客的讀者所知道的&#xff0c; 我有點像Maven迷 。 我從2007年8月左右開始使用Maven&#xff0c;從沒有回過頭。 但是&#xff0c;就像其他所有情況一樣&#xff0c;“變化是唯一不變的”。 現在這個領域還有其他參與者&#xff0c;Gradle看起來是最有前途的。 我決定試…

    postgis安裝_從零開始,構建電子地圖網站:0_2_數據處理postgis

    軟件安裝完&#xff0c;開始數據處理。從China Historical GIS下載一份數據。一、數據下載數據來源&#xff1a;China Historical GIS&#xff1a;https://sites.fas.harvard.edu/~chgis/data/chgis/v6/先下載一份時間序列數據&#xff1a;Download CHGIS V6 TIME SERIES Datah…

    sar圖像去噪matlab,一種基于總曲率的SAR圖像變分去噪方法與流程

    本發明屬于數字圖像處理技術領域&#xff0c;具體涉及一種基于總曲率的SAR圖像變分去噪方法。背景技術&#xff1a;&#xff1a;相干斑噪聲是合成孔徑雷達(Synthetic Aperture Radar&#xff0c;簡稱SAR)圖像的重要特征&#xff0c;嚴重影響SAR圖像的可解譯性。相干斑噪聲通常作…

    Linux下用netstat查看網絡狀態、端口狀態

    在linux一般使用netstat 來查看系統端口使用情況步。 netstat命令是一個監控TCP/IP網絡的非常有用的工具&#xff0c;它可以顯示路由表、實際的網絡連接以及每一個網絡接口設備的 netstat命令的功能是顯示網絡連接、路由表和網絡接口信息&#xff0c;可以讓用戶得知目…

    課時2.瀏覽器和服務器(了解)

    1.什么是瀏覽器&#xff1f; 瀏覽器就是由安裝在我們電腦上的一款軟件&#xff0c;QQ&#xff0c;百度影音等一樣&#xff0c;都是安裝在電腦上的一款軟件 那這些軟件之間由什么區別呢&#xff1f; 它們的區別就是它們的功能不太一樣&#xff0c;QQ是用來聊天的&#xff0c;…

    微信自動回復

    http://itchat.readthedocs.io/zh/latest/tutorial/tutorial0/。 這個是學習網址&#xff0c;到時候自己學一下。做個案例試試轉載于:https://www.cnblogs.com/lilinzhiyu/p/7985864.html

    python 定義變量_用python解決動態的定義變量名(并給其賦值方法:大數據處理)...

    前言&#xff1a;今天為大家帶來的內容是&#xff1a;用python解決動態的定義變量名(并給其賦值方法&#xff1a;大數據處理)具有很好的參考價值&#xff0c;希望對大家有所幫助。喜歡本文內容的記得點贊轉發收藏不迷路哦&#xff01;&#xff01;&#xff01;最近消費kafka數據…

    appcan php圖片上傳,appcan文件上傳php,asp通用

    首先說appcan內部實現了file標簽&#xff0c;我們就不用糾結這個問題了&#xff0c;還提供了上傳百分比哦&#xff0c;然后下面的方法按從上到下依次看&#xff0c;很簡單。上傳php&#xff0c;asp頁面很簡單 &#xff0c;接收‘file_data’這個文件信息就可以了&#xff0c;如…

    javascript 動態修改css樣式

    方法一&#xff1a;改變外聯css文件&#xff0c;這里不講這個。 方法二&#xff1a;通過改變claaName來改變樣式&#xff0c;語法&#xff1a; obj.className "style2";//或者obj.setAttribute("class", "style2"); 方法三&#xff1a;使用obj…

    POJ 3225 Help with Intervals(線段樹)

    POJ 3225 Help with Intervals 題目鏈接 集合數字有的為1&#xff0c;沒有為0&#xff0c;那么幾種操作相應就是置為0或置為1或者翻轉&#xff0c;這個隨便推推就能夠了&#xff0c;然后開閉區間的處理方式就是把區間擴大成兩倍&#xff0c;偶數存點&#xff0c;奇數存線段就可…