guava 并发同步_Google Guava –与Monitor同步

guava 并发同步

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

    guava 并发同步

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

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

    相关文章

    qt 定时器_Qt开源作品23-颜色拾取器

    ## 一、前言在做很多项目的UI界面的时候&#xff0c;相信绝大部分人都有过抄袭别人的UI界面尤其是颜色的时候&#xff0c;毕竟十个程序员九个没有审美&#xff0c;或者说审美跟一坨屎一样&#xff0c;大家主要的精力以及擅长点都是在写功能实现具体功能上面&#xff0c;这个事情…

    第5章学习小结

    第五章主要学习了树的知识&#xff0c;以前一直很好奇&#xff0c;为什么电脑能存储像树一样的数据结构&#xff0c;学完才发现&#xff0c;ADT加数组或者ADT加链表真的可以衍生出多种多样的数据类型&#xff0c;以下做出本章小结&#xff1a; 1.利用ASCII码实现不同类型的数据…

    tf.transpose

    tf.transpose(input, [dimension_1,dimenaion_2,..,dimension_n]) 这个函数主要适用于交换输入张量的不同维度用的&#xff0c;如果输入张量是二维&#xff0c;就相当是转置。dimension_n是整数&#xff0c;如果张量是三维&#xff0c;就是用0,1,2来表示。这个列表里的每个数对…

    【20171025中】alert(1) to win 脚本渲染自建

    游戏误人生&#xff0c;一下午玩了将近四个小时的三国杀&#xff0c;后悔不已&#xff0c;然后重新拾起xss challenge&#xff0c;突发奇想&#xff0c;自己构建渲染后的html。 从最简单的开始。 自动检测html: <!DOCTYPE html> <html> <head><meta http-…

    使用JPA和@NamedQueries的Spring数据

    如果在JPA实体上使用Spring Data和NamedQuery批注&#xff0c;则可以使用spring数据存储库以更方便的方式轻松使用它们。 在先前的博客中&#xff0c;我们使用spring boot和docker 创建了spring数据项目。 我们将使用相同的项目并增强存储库的功能。 我们将实现一个命名查询&…

    vs无法写入量的大数据_一个每天服务数万人的企业食堂:自助餐按重计价,大数据支持食材预备量...

    钱江晚报小时新闻记者 祝瑶 昨天下午6点多&#xff0c;钱报记者来到杭州阿里巴巴总部。这里共有5个员工食堂&#xff0c;几乎覆盖了全国各地的口味&#xff0c;每天为数万阿里人服务。其中&#xff0c;最当红的是2号食堂&#xff0c;除了有丰俭由人的自助餐区&#xff0c;还有十…

    6号板编译失败找不到arm-none-linux-gnueabi-gcc

    明明已经添加到/etc/environment 安装sudo apt-get install lib32z1 lib32ncurses5转载于:https://www.cnblogs.com/xpylovely/p/10817240.html

    tf.train.Saver

    将训练好的模型参数保存起来&#xff0c;以便以后进行验证或测试&#xff0c;这是我们经常要做的事情。tf里面提供模型保存的是tf.train.Saver()模块。 模型保存&#xff0c;先要创建一个Saver对象&#xff1a;如 savertf.train.Saver() 在创建这个Saver对象的时候&#xff…

    Neo4j:空值如何工作?

    我时不时地发现自己想将CSV文件导入Neo4j&#xff0c;而我总是对如何处理可能潜伏在其中的各种空值感到困惑。 让我们从一个没有CSV文件的示例开始。 考虑以下列表&#xff0c;以及我尝试仅返回空值的尝试&#xff1a; WITH [null, "null", "", "Ma…

    楼层钢筋验收会议纪要_钢筋施工质量通病防治

    一、钢筋原材1、钢筋表面出现黄色浮锈&#xff0c;严重转为红色&#xff0c;日久后变成暗褐色&#xff0c;甚至发生鱼鳞片剥落现象。图片原因保管不良&#xff0c;受到雨雪侵蚀&#xff0c;存放期长&#xff0c;仓库环境潮湿&#xff0c;通风不良。防 治 措 施1、钢筋原料应存放…

    simulink代码生成(一)——环境搭建

    一、安装C2000的嵌入式环境&#xff1b; 点击matlab附加功能&#xff0c; 然后搜索C2000&#xff0c;安装嵌入式硬件支持包&#xff1b;点击安装即可&#xff1b;&#xff08;目前还不知道破解版的怎么操作&#xff0c;目前我用的是正版的这样&#xff0c;完全破解的可能操作…

    五步法颈椎病自我按摩图解

    ​​1.揉捏颈、肩、臂 操作&#xff1a;自我按摩时取坐位。拇指张开&#xff0c;其余四指并拢&#xff0c;虎口相对用力&#xff0c;自枕部开始沿颈椎棘突两旁的肌肉向下揉捏&#xff0c;至上背部手能摸到之处为止。反复揉捏3分钟&#xff0c;然后以相同手法揉捏患侧上肢和颈部…

    tf.one_hot

    tf.one_hot(indices,#输入&#xff0c;这里是一维的depth,# one hotdimension.on_valueNone,#output 默认1off_valueNone,#output 默认0axisNone,#根据我的实验&#xff0c;默认为1dtypeNone,nameNone) 测试程序&#xff0c;一般说&#xff0c;有几类&#xff0c;depth等于分类…

    使用get set方法添减属性_头皮银屑病“克星”使用方法,你GET了吗?

    相信小伙伴们最近都了解了治疗头皮银屑病需要使用专业剂型。但...方法不对&#xff0c;心血白费。头皮银屑病专用剂型的正确使用方法&#xff0c;你真的知道吗&#xff1f;快来和利奥娜一起&#xff0c;Get√正确的使用方法吧&#xff01;适合头皮银屑病的专用药剂1.复方制剂卡…

    spring hsqldb_在Spring中嵌入HSQLDB服务器实例

    spring hsqldb我一直在愉快地使用XAMPP进行开发&#xff0c;直到不得不将其托管在可通过Internet访问的某个地方&#xff0c;供客户端进行测试和使用。 我有一个仅具有384 RAM的VPS&#xff0c;并且需要快速找到方法&#xff0c;因此决定将XAMPP安装到VPS中。 由于内存较低&…

    线性回归,logistic回归和一般回归

    http://www.cnblogs.com/riskyer/p/3217601.html转载于:https://www.cnblogs.com/focus-z/p/10822757.html

    double小数点后最多几位_基金理财买入后,不断亏损,是最多本金亏光,还是会出现负值...

    投资基金不会把本金亏光&#xff0c;更不会倒贴钱&#xff0c;基金是一篮子股票&#xff0c;个别股票或许有黑天鹅事件&#xff0c;不可能全部同时出现&#xff0c;持续亏损的话&#xff0c;可能最后面临清盘&#xff0c;有结算流程&#xff0c;会将剩下的份额折算到投资者的账…

    tf.layers.flatten

    flatten( inputs, nameNone) 参数说明如下&#xff1a; inputs&#xff1a;必需&#xff0c;即输入数据。name&#xff1a;可选&#xff0c;默认为 None&#xff0c;即该层的名称。

    JUnit 5 –参数化测试

    JUnit 5令人印象深刻&#xff0c;尤其是当您深入研究扩展模型和体系结构时 。 但是从表面上讲&#xff0c;编写测试的地方&#xff0c;开发的过程比革命的过程更具进化性 – JUnit 4上没有杀手级功能吗&#xff1f; 幸运的是&#xff0c;至少有一个&#xff1a;参数化测试。 JU…

    RMQ问题-ST表倍增处理静态区间最值

    简介 ST表是利用倍增思想处理RMQ问题&#xff08;区间最值问题&#xff09;的一种工具。 它能够做到O(nlogn)预处理&#xff0c;O(1)查询的时间复杂度&#xff0c;效率相当不错。 算法 1.预处理 ST表利用倍增的思想。以洛谷的P3865作为例子。我们需要查询某一区间的最大值。 我…