Google Guava –与Monitor同步

Google Guava项目是每个Java开发人员都应该熟悉的库的集合。 Guava库涵盖I / O,集合,字符串操作和并发性。 在这篇文章中,我将介绍Monitor类。 Monitor是一种同步构造,可以在使用ReentrantLock的任何地方使用。 在任何时候,只有一个线程可以占用一个监视器。 Monitor类具有进入离开操作,这些操作在语义上与ReentrantLock中的锁定解锁操作相同。 此外,监视器支持在布尔条件下等待。
比较Monitor和ReentrantLock

对于初学者,将Monitor和ReentrantLock进行并排比较会很有帮助。

public class ReentrantLockSample {private List<String> list = new ArrayList<String>();private static final int MAX_SIZE = 10;private ReentrantLock rLock = new ReentrantLock();private Condition listAtCapacity = rLock.newCondition();public void addToList(String item) throws InterruptedException {rLock.lock();try {while (list.size() == MAX_SIZE) {listAtCapacity.await();}list.add(item);} finally {rLock.unlock();}}
}

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) {@Overridepublic boolean isSatisfied() {return (list.size() < MAX_SIZE);}};public void addToList(String item) throws InterruptedException {monitor.enterWhen(listBelowCapacity);try {list.add(item);} finally {monitor.leave();}}
}

从示例中可以看到,两者实际上具有相同数量的代码行。 与ReentrantLock Condition相比, Monitor会在Guard对象周围增加一些复杂性。 但是, Monitor addToList方法的清晰度远远不能弥补。 这可能只是我的个人喜好,但我一直发现

while(something==true){condition.await()
}

有点尴尬。

使用指南

应当注意,返回void enter方法应始终采用以下形式:

monitor.enter()
try{...work..
}finally{monitor.leave();
}

enter返回boolean方法应类似于:

if(monitor.enterIf(guard)){try{...work..}finally{monitor.leave();}
}else{.. monitor not available..
}


布尔条件

Monitor类上的enter方法太多,无法有效地完成一篇文章,所以我将挑选我的前三名,然后按照从最小阻塞到最大阻塞的顺序进行介绍。

    1. tryEnterIf –线程将不等待进入监视器,仅在保护条件返回true时才进入。
    2. enterIf –线程将等待进入监视器,但前提是保护条件返回true。 还有enterIf方法签名,这些签名允许指定超时以及enterIfInterruptible版本。
    3. enterWhen –线程将无限期等待监视器条件返回true,但可以被中断。 同样,也有用于指定超时的选项以及enterWhenUniterruptible版本。


结论

我还没有机会在工作中使用Monitor,但是我可以看到布尔保护条件的粒度有用。 我已经写了一些基本的示例代码和一个随附的单元测试,以演示本文所涵盖的一些功能。 它们在这里可用。 一如既往地欢迎您提出意见/建议。 在我的下一篇文章中,我将介绍Guava并发中的更多内容。

资源资源

    • 番石榴项目首页
    • 监控器API
    • 样例代码


    参考资料: Google Guava –我们的JCG合作伙伴 Bill Bejeck在“ 随机编码想法”博客上与Monitor进行了同步 。

    翻译自: https://www.javacodegeeks.com/2012/11/google-guava-synchronization-with-monitor.html

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370329.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    yaf 重写index.php,php框架Yaf路由重写实例代码

    通常为了友好的URL格式&#xff0c;会进行站点URL的重写&#xff0c;可以在webserver(Nginx)的配置中进行rewrite&#xff0c;也可在在程序端进行&#xff0c;本文主要和大家介绍php框架Yaf路由重写&#xff0c;给大家做个参考&#xff0c;希望能帮助到大家。以下使用Yaf框架进…

    python类初始化导入库_Python中optparser库用法实例详解

    本文研究的主要是Python中optparser库的相关内容&#xff0c;具体如下。一直以来对optparser不是特别的理解&#xff0c;今天就狠下心&#xff0c;静下心研究了一下这个库。当然了&#xff0c;不敢说理解的很到位&#xff0c;但是足以应付正常的使用了。废话不多说&#xff0c;…

    SQL--Chapter8--Working with Triggers and Transactions

    Objectives:1.Implement triggers 2.Implement transactions 转载于:https://www.cnblogs.com/Catherinezhilin/p/7979644.html

    Canvas制作的下雨动画

    简介 在codepen上看到一个Canvas做的下雨效果动画&#xff0c;感觉蛮有意思的。就研究了下&#xff0c;这里来分享下&#xff0c;实现技巧。效果可以见下面的链接。 霓虹雨: http://codepen.io/natewiley/full/NNgqVJ/ 效果截图&#xff1a; Canvas动画基础 大家都知道&…

    在Eclipse中有效使用JUnit

    最近&#xff0c;我被卷入了讨论1和一些受感染的同伴2&#xff0c;他们关于我们如何在Eclipse IDE中使用JUnit 。 令人惊讶的是&#xff0c;对话带来了并非所有人都知道的一些“技巧”。 这使我有了写这篇文章的想法&#xff0c;总结了我们的演讲。 谁知道–也许有人也有新事物…

    jquery文件上传控件 Uploadify

    基于jquery的文件上传控件&#xff0c;支持ajax无刷新上传&#xff0c;多个文件同时上传&#xff0c;上传进行进度显示&#xff0c;删除已上传文件。 要求使用jquery1.4或以上版本&#xff0c;flash player 9.0.24以上。 有两个版本&#xff0c;一个用flash,一个是html5。html5…

    imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例

    PHP 使用Imagick模块 缩放&#xff0c;裁剪&#xff0c;压缩图片 包括gif图片缩放 裁剪代码如下:/*** 图片裁剪* 裁剪规则&#xff1a;* 1. 高度为空或为零 按宽度缩放 高度自适应* 2. 宽度为空或为零 按高度缩放 宽度自适应* 3. 宽度&#xff0c;高度到不为空或为…

    php实现第三方邮箱登录_PHP实现用户异地登录提醒功能的方法

    有时候你的网站账号被盗或你在别处登录操作后台时&#xff0c;右下角会弹出提示信息&#xff0c;提醒你的账号异地登录&#xff0c;或者会被强制下线。对于这种安全性要求比较高的web网站&#xff0c;很多后台管理都会做这种功能提醒。甄别自己的账号是否被盗或者是否有另一个人…

    课时47.datalist标签(了解)

    1.datalist标签 作用&#xff1a;给输入框绑定待选项 2.datalist格式&#xff1a; <datalist> <option>待选项内容</option> </datalist> 3.如何给输入框绑定待选列表&#xff1f; 搞一个输入框搞一个datalist列表给datalist列表标签添加一个id给…

    pandas.read_csv参数详解

    读取CSV&#xff08;逗号分割&#xff09;文件到DataFrame也支持文件的部分导入和选择迭代更多帮助参见&#xff1a;http://pandas.pydata.org/pandas-docs/stable/io.html参数&#xff1a;filepath_or_buffer : str&#xff0c;pathlib。str, pathlib.Path, py._path.local.Lo…

    Gradle – Maven的观点

    正如我博客的读者所知道的&#xff0c; 我有点像Maven迷 。 我从2007年8月左右开始使用Maven&#xff0c;从没有回过头。 但是&#xff0c;就像其他所有情况一样&#xff0c;“变化是唯一不变的”。 现在这个领域还有其他参与者&#xff0c;Gradle看起来是最有前途的。 我决定试…

    postgis安装_从零开始,构建电子地图网站:0_2_数据处理postgis

    软件安装完&#xff0c;开始数据处理。从China Historical GIS下载一份数据。一、数据下载数据来源&#xff1a;China Historical GIS&#xff1a;https://sites.fas.harvard.edu/~chgis/data/chgis/v6/先下载一份时间序列数据&#xff1a;Download CHGIS V6 TIME SERIES Datah…

    sar图像去噪matlab,一种基于总曲率的SAR图像变分去噪方法与流程

    本发明属于数字图像处理技术领域&#xff0c;具体涉及一种基于总曲率的SAR图像变分去噪方法。背景技术&#xff1a;&#xff1a;相干斑噪声是合成孔径雷达(Synthetic Aperture Radar&#xff0c;简称SAR)图像的重要特征&#xff0c;严重影响SAR图像的可解译性。相干斑噪声通常作…

    Linux下用netstat查看网络状态、端口状态

    在linux一般使用netstat 来查看系统端口使用情况步。 netstat命令是一个监控TCP/IP网络的非常有用的工具&#xff0c;它可以显示路由表、实际的网络连接以及每一个网络接口设备的 netstat命令的功能是显示网络连接、路由表和网络接口信息&#xff0c;可以让用户得知目…

    课时2.浏览器和服务器(了解)

    1.什么是浏览器&#xff1f; 浏览器就是由安装在我们电脑上的一款软件&#xff0c;QQ&#xff0c;百度影音等一样&#xff0c;都是安装在电脑上的一款软件 那这些软件之间由什么区别呢&#xff1f; 它们的区别就是它们的功能不太一样&#xff0c;QQ是用来聊天的&#xff0c;…

    微信自动回复

    http://itchat.readthedocs.io/zh/latest/tutorial/tutorial0/。 这个是学习网址&#xff0c;到时候自己学一下。做个案例试试转载于:https://www.cnblogs.com/lilinzhiyu/p/7985864.html

    python 定义变量_用python解决动态的定义变量名(并给其赋值方法:大数据处理)...

    前言&#xff1a;今天为大家带来的内容是&#xff1a;用python解决动态的定义变量名(并给其赋值方法&#xff1a;大数据处理)具有很好的参考价值&#xff0c;希望对大家有所帮助。喜欢本文内容的记得点赞转发收藏不迷路哦&#xff01;&#xff01;&#xff01;最近消费kafka数据…

    appcan php图片上传,appcan文件上传php,asp通用

    首先说appcan内部实现了file标签&#xff0c;我们就不用纠结这个问题了&#xff0c;还提供了上传百分比哦&#xff0c;然后下面的方法按从上到下依次看&#xff0c;很简单。上传php&#xff0c;asp页面很简单 &#xff0c;接收‘file_data’这个文件信息就可以了&#xff0c;如…

    javascript 动态修改css样式

    方法一&#xff1a;改变外联css文件&#xff0c;这里不讲这个。 方法二&#xff1a;通过改变claaName来改变样式&#xff0c;语法&#xff1a; obj.className "style2";//或者obj.setAttribute("class", "style2"); 方法三&#xff1a;使用obj…

    POJ 3225 Help with Intervals(线段树)

    POJ 3225 Help with Intervals 题目链接 集合数字有的为1&#xff0c;没有为0&#xff0c;那么几种操作相应就是置为0或置为1或者翻转&#xff0c;这个随便推推就能够了&#xff0c;然后开闭区间的处理方式就是把区间扩大成两倍&#xff0c;偶数存点&#xff0c;奇数存线段就可…