Guava monitor
Guava的com.google.util.concurrent类库提供了相对于jdk java.util.concurrent包更加方便实用的并发类,Monitor类就是其中一个。Monitor类在处理互斥操作,同步访问数据块,提供了相比于synchronized关键字更加方便简洁的解决方案。

Synchronizing threads
Java提供了synchronized关键字来完成顺序访问某一数据块,但是使用synchronized存在一些问题,第一:如果我们使用在线程中使用wait(),我们必须记着使用while循环:
while (some condition) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
第二:如果包含多个condition可以导致一个wait状态,我们必须使用notifyAll,因为我们无法去指定的notify某个condition。使用notifyAll不尽人意,因为我们不得不去为了lock某个条件而唤醒所有的线程。Java 5引入了ReentrantLock,允许用户创建condition,可以通过使用Condition.signal()方法唤醒某一指定的condition,但是Condition.signalAll和notifyAll具有相同问题。也依然会存在while循环:
while (some condition) {
try {
condition.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Monitor
Monitor类允许多个conditions,可以提供隐式的线程condition转换策略。下面是一个Monitor简单的例子:
public class SerialPrinterUsingGuava {
private static final int MAX_SIZE = 10;
private List<String> list = new ArrayList<String>();
private Monitor monitor = new Monitor();
private Guard listBelowCapacity = new Guard(monitor) {
@Override
public boolean isSatisfied() {
return list.size() < MAX_SIZE;
}
};
public void addToList(String item) throws InterruptedException {
monitor.enterWhen(listBelowCapacity);
try {
list.add(item);
} finally {
monitor.leave();
}
}
}
上面的例子中,当调用addToList方法向list中插入数据,进入monitor块,如果满足当前定义的限制条件,list.size<MaxSize,则执行list添加数据操作,最后在finally块中会释放当前线程占有的锁。monitor.enterwhen()方法的内部实际上使用是可重入锁,当定义的Guard条件满足时,整个Monitor块会被lock,在同一个时间只允许一个线程访问monitor代码块。
Monitor最佳实践
对于Monitor方法返回Boolean值,可以使用下面的代码模板,在If中包裹try-finally,在finally中释放锁。
if(monitor.enterIf(guardCondition){
try {
doWork();
} finally {
monitor.leave();
}
}
对于Monitor方法无返回值的,可以使用try-finally block,在finally中释放锁
monitor.enterWhen(guardCondition);
try {
doWork();
} finally {
monitor.leave()
}
Conclusion
今天和分享了Guava Monitor的一些特性,及其使用方法,更多的使用特性读者可以参考Google提供的Guava API文档自行查阅。
Guava monitor的更多相关文章
- Google guava 中的Monitor
synchronized 自从Java提供了多线程编程,我们经常需要处理这样的情况:在特定的时间,我们需要限制访问,确保只有一个线程访问我们的代码.Java提供了同步关键字synchronized来实 ...
- guava学习--monitor
转载:https://my.oschina.net/realfighter/blog/349924 https://my.oschina.net/realfighter/blog/349926 M ...
- Guava Cache相关
官方:http://ifeve.com/google-guava-cachesexplained/ 理解:https://segmentfault.com/a/1190000007300118 项目中 ...
- Guava ---- Concurrent并发
Guava在JDK1.5的基础上, 对并发包进行扩展. 有一些是易用性的扩展(如Monitor). 有一些是功能的完好(如ListenableFuture). 再加上一些函数式编程的特性, 使并发包的 ...
- Spring cache简单使用guava cache
Spring cache简单使用 前言 spring有一套和各种缓存的集成方式.类似于sl4j,你可以选择log框架实现,也一样可以实现缓存实现,比如ehcache,guava cache. [TOC ...
- C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...
- Guava库介绍之实用工具类
作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文是我写的Google开源的Java编程库Guava系列之一,主要介 ...
- Google Java编程库Guava介绍
本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含集合(Collections),缓存(Caching),并发编程库(C ...
- API Monitor简介(API监控工具)
API Monitor是一个免费软件,可以让你监视和控制应用程序和服务,取得了API调用. 它是一个强大的工具,看到的应用程序和服务是如何工作的,或跟踪,你在自己的应用程序的问题. 64位支持 API ...
随机推荐
- 【leetcode】Valid Parentheses
题目简述: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if th ...
- BZOJ 1305: [CQOI2009]dance跳舞 二分+最大流
1305: [CQOI2009]dance跳舞 Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲 ...
- mac版Camtasia 2.10破解
Camtasia是非常好用的一款录屏.视频编辑.制作的软件.但是这么一款优秀的软件只有30天的试用期,试用期过后便不能使用. 目前网上的破解办法几乎都属于同一种办法: http://www.orsoo ...
- jQuery 追加元素的方法如append、prepend、before,after(转)
1.jQuery append() 方法 jQuery append() 方法在被选元素的结尾插入内容. 实例 复制代码代码如下: $("p").append("Some ...
- JFreeChart
花了四个小时给同学写的.还行吧,原来都没有用过到处找资料写的. package DrawLine; import org.jfree.chart.ChartFactory; import org.jf ...
- Xamarin笔记
Xamarin学习笔记 1. Xamarin Studio自动更新下载的安装文件缓存路径:C:\Users\登录用户\AppData\Local\XamarinStudio-5.0\Cache\Tem ...
- [MySQL+PHP] 触发器及存储过程等MySQL功能在PHP中实现的坑
折腾了一下午,始终没有能搞定在PHP中编写事件. 因为业务需求,需要实现一个预操作的功能,即业务人员填写未来的某个要做某个操作.在这个日期到来之前,则一切照常. 想通过PHP编写MySQL Event ...
- ARP报文发送的可视化实现
一.安装VS2013,下载wpdpack,为VS2010配置WinpCap环境: ⑴首先在View中选择Property Manager,然后展开工程,再展开Debug|Win32 ,接着右击 Mir ...
- PHP用户注册与登录完整代码【4】
login.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// ...
- jQuery的加法运算.
jQuery的加法运算. 加法运算 ?想必大家听到这都会不屑了,加法运算这是多么简单的运算.然而有的时候在jQuery也让人挺头疼的. 常规的是: var num1 = 123; var num2=1 ...