继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Guava并发:使用Monitor控制并发

汪汪一只猫
关注TA
已关注
手记 607
粉丝 130
获赞 719

Monitor就像java原生的synchronized, ReentrantLock一样,每次只允许一个线程执行代码块,且可重占用,每一次占用要对应一次退出占用。

/**
 * 通过Monitor的Guard进行条件阻塞
 */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) {        @Override        public boolean isSatisfied() {            return list.size() < MAX_SIZE;        }    }; 
    public void addToList(String item) throws InterruptedException {        monitor.enterWhen(listBelowCapacity); //Guard(形如Condition),不满足则阻塞,而且我们并没有在Guard进行任何通知操作        try {            list.add(item);        } finally {            monitor.leave();        }    }}

就如上面,我们通过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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP