设为首页 加入收藏

TOP

Google Guava 中的Monitor
2015-07-16 12:57:49 来源: 作者: 【 】 浏览:65
Tags:Google Guava Monitor

自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码。Java提供了同步关键字synchronized来实现这种访问控制,但是使用synchronized会存在一些问题。第一个问题是,当我们需要调用线程的wait()方法时,我们必须记得去使用while循环。


看下面例子,来自guava monitor api上的说明:


在这个例子中获取一个值,当值不存在的时候,我们等待。。。有值的时候需要notifyAll()。这里需要注意的是,我们要在while循环中使用wait方法,而不是if。另外用notifyAll而不是notify。


在java.util.concurrent包中提供了ReentrantLock,我们使用它来实现上面的场景看看


我们依然需要使用while循环,但是有一个好处,我们可以定义两个Condition,这样我们就可以用signal来替代signalAll,这样可能会带来一点性能上的提升。


Monitor是一个支持任意布尔条件的同步的抽象,Monitor类是作为ReentrantLock的一个替代,代码中使用Monitor比使用ReentrantLock更不易出错,可读性也更强,并且也没有显著的性能损失,使用Monitor甚至有潜在的性能得到优化,下面我们看看用guava中的Monitor怎么重写上面的代码


可以发现使用guava之后,我们不需要使用while,使用Monitor.Guard定义进入代码快的条件即可,代码变得更加容易阅读,写起来也更加方便。
当我们Monitor的方法返回boolean值的时候,我们在if块中包含try-finally块,确保锁能够释放。


当monitor的方法不返回任何值的时候,我们的代码也需要在finally中释放锁


Monitor有几个常用的方法


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java自定义Annotation,通过反射解.. 下一篇Java中事务的属性ACID

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: