guava 并发同步_Google Guava –与Monitor同步
guava 并發(fā)同步
Google Guava項目是每個Java開發(fā)人員都應(yīng)該熟悉的庫的集合。 Guava庫涵蓋了I / O,集合,字符串操作和并發(fā)性。 在這篇文章中,我將介紹Monitor類。 Monitor是一種同步構(gòu)造,可以在使用ReentrantLock的任何地方使用。 隨時只有一個線程可以占用一個監(jiān)視器。 Monitor類具有進(jìn)入和離開操作,這些操作在語義上與ReentrantLock中的鎖定和解鎖操作相同。 此外,監(jiān)視器支持在布爾條件下等待。
比較Monitor和ReentrantLock
對于初學(xué)者來說,將Monitor和ReentrantLock進(jìn)行并排比較會很有幫助。
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();}} }從示例中可以看到,兩者實際上具有相同數(shù)量的代碼行。 與ReentrantLock Condition相比, Monitor會在Guard對象周圍增加一些復(fù)雜性。 但是, Monitor addToList方法的清晰度遠(yuǎn)遠(yuǎn)不能彌補(bǔ)。 這可能只是我的個人喜好,但我一直發(fā)現(xiàn)
while(something==true){condition.await() }有點(diǎn)尷尬。
使用指南
應(yīng)當(dāng)注意,返回void enter方法應(yīng)始終采用以下形式:
monitor.enter() try{...work.. }finally{monitor.leave(); }并enter返回boolean方法,如下所示:
if(monitor.enterIf(guard)){try{...work..}finally{monitor.leave();} }else{.. monitor not available.. }
布爾條件
Monitor類上的enter方法太多,無法有效地完成一篇文章,所以我將挑選我的前三名,然后按照從最小阻塞到最大阻塞的順序進(jìn)行介紹。
結(jié)論
我還沒有機(jī)會在工作中使用Monitor,但是我可以看到布爾保護(hù)條件的粒度有用。 我已經(jīng)寫了一些基本的示例代碼和一個隨附的單元測試,以演示本文所涵蓋的一些功能。 它們在這里可用。 一如既往地歡迎您提出意見/建議。 在我的下一篇文章中,我將介紹Guava并發(fā)中的更多內(nèi)容。
資源資源
- 番石榴項目首頁
- 監(jiān)控器API
- 樣例代碼
參考資料: Google Guava –我們的JCG合作伙伴 Bill Bejeck在“ 隨機(jī)編碼想法”博客上與Monitor進(jìn)行了同步 。
翻譯自: https://www.javacodegeeks.com/2012/11/google-guava-synchronization-with-monitor.html
guava 并發(fā)同步
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的guava 并发同步_Google Guava –与Monitor同步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果怎么用副号发短信
- 下一篇: 使用JPA和@NamedQueries的