为了账号安全,请及时绑定邮箱和手机立即绑定

Guava并发:使用Monitor控制并发

标签:
Java

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消