Guava併發:使用Monitor控制併發

kboypkb發表於2021-09-09

Monitor就像java原生的synchronized, ReentrantLock一樣,每次只允許一個執行緒執行程式碼塊,且可重佔用,每一次佔用要對應一次退出佔用。

/**
 * 透過Monitor的Guard進行條件阻塞
 */public class MonitorSample {    private List list = new ArrayList();    private static final int MAX_SIZE = 10;    private Monitor monitor = new Monitor();     
    private Monitor.Guard listBelowCapacity = new Monitor.Guard(monitor) {        @Override        public boolean isSatisfied() {            return list.size() 

就如上面,我們透過if條件來判斷是否可進入Monitor程式碼塊,並再try/finally中釋放:

if (monitor.enterIf(guardCondition)) {        try {              doWork();    } finally {           monitor.leave();       }}

其他的Monitor訪問方法:

  1. Monitor.enter //進入Monitor塊,將阻塞其他執行緒直到Monitor.leave

  2. Monitor.tryEnter //嘗試進入Monitor塊,true表示可以進入, false表示不能,並且不會一直阻塞

  3. Monitor.tryEnterIf //根據條件嘗試進入Monitor塊

這幾個方法都有對應的超時設定版本。

原文連結:http://outofmemory.cn/java/guava/concurrent/Monitor

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2805643/,如需轉載,請註明出處,否則將追究法律責任。

相關文章