guava 并发_使用Guava对并发应用程序进行基于对象的微锁定

guava 并发

编写并发Java应用程序时最令人讨厌的问题之一是对线程之间共享的资源的处理,例如Web应用程序的会话和应用程序数据。 结果,如果应用程序的并发级别很低,许多开发人员选择根本不同步这些资源。 例如,不太可能同时访问会话资源:如果请求周期在短时间内完成,则在第一个请求周期仍在进行时,用户不太可能使用第二个浏览器选项卡发送并发请求。 随着Ajax驱动的Web应用程序的兴起,这种信任方法的确变得越来越危险。 在Ajax应用程序中,例如,用户可以在另一个浏览器窗口中启动类似任务时,请求完成一项较长时间的任务。 如果这些任务访问或写入会话数据,则需要同步此类访问。 否则,您将面临细微的错误,甚至会遇到安全问题,例如本博客文章中指出的那样 。

Java的synced关键字是引入锁的一种简单方法。 例如,此示例仅在需要将新实例写入会话时才阻塞请求周期的线程。

HttpSession session = request.getSession(true);
if (session.getAttribute("shoppingCart") == null) {synchronize(session) {if(session.getAttribute("shoppingCart")= null) {cart = new ShoppingCart();session.setAttribute("shoppingCart");}}
}
ShoppingCart cart = (ShoppingCart)session.getAttribute("shoppingCart");
doSomethingWith(cart);

此代码会将新的ShoppingCart实例添加到会话中。 每当找不到购物车时,该代码将获取当前用户会话的监视器,并将新的ShoppingCart添加到当前用户的HttpSession中。 但是,此解决方案具有以下缺点:

  1. 每当通过与上述相同的方法将任何值添加到会话中时,任何正在访问当前会话的线程都将阻塞。 当两个线程尝试访问不同的会话值时,也会发生这种情况。 这将使应用程序的限制更加严格。
  2. Servlet API实现可能选择实现HttpSession而不是一个单例实例。 在这种情况下,整个同步将失败。 (但是,这不是Servlet API的常见实现。)

最好找到一个要与HttpSession实例进行同步的对象。 但是,创建此类对象并在不同线程之间共享它们会带来相同的问题。 避免这种情况的一种好方法是使用既固有并发又允许使用弱键的Guava缓存:

LoadingCache<String, Object> monitorCache = CacheBuilder.newBuilder().weakValues().build(new CacheLoader<String, Object>{public Object load(String key) {return new Object();}});

现在,我们可以像这样重写锁定代码:

HttpSession session = request.getSession(true);
Object monitor = ((LoadingCache<String,Object>)session.getAttribute("cache")).get("shoppingCart");
if (session.getAttribute("shoppingCart") == null) {synchronize(monitor) {if(session.getAttribute("shoppingCart")= null) {cart = new ShoppingCart();session.setAttribute("shoppingCart");}}
}
ShoppingCart cart = (ShoppingCart)session.getAttribute("shoppingCart");
doSomethingWith(cart);

Guava缓存是自填充的,将仅返回一个Monitor Object实例,该实例可用作对共享会话资源的锁定,该资源由shoppingCart普遍标识。 Guava缓存由ConcurrentHashMap支持,该ConcurrentHashMap通过仅在映射键的哈希值存储桶上进行同步来避免同步。 结果,使应用程序成为线程安全的,而不会全局阻止它。 另外,您不必担心内存不足,因为如果不再使用监视器(和相关的缓存条目),则会被垃圾回收。 如果您不使用其他缓存,甚至可以考虑使用软引用来优化运行时间。

当然可以完善这种机制。 例如,除了返回Object实例之外,还可以返回ReadWriteLock。 同样,在会话启动时实例化LoadingCache也很重要。 例如,这可以通过HttpSessionListener实现。

参考: My Daily Java博客上的JCG合作伙伴 Rafael Winterhalter提供的Guava使用并发应用程序的基于对象的微锁定 。

翻译自: https://www.javacodegeeks.com/2013/12/object-based-micro-locking-for-concurrent-applications-by-using-guava.html

guava 并发

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

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

相关文章

【渝粤题库】陕西师范大学500001 理论力学 作业(专升本)

《理论力学》作业 一. 填空 在平面极坐标系中&#xff0c;速度的径向分量为______ &#xff0c;横向分量为_____&#xff0c;加速度的径向分量为_____&#xff0c;横向分量为_____。在平面自然坐标系中&#xff0c;的方向为______&#xff0c;&#xff0c;质点的切向加速度为_…

java数组按照大小排列_Java怎么让数组中元素按照牌值从小到大的顺序排列

展开全部你说的这些牌是用数组来存放的&#xff0c;所以有些麻烦。直接复制运行&#xff0c;更改牌的62616964757a686964616fe58685e5aeb931333332643838数量测试&#xff0c;有不懂的再问我package test;import java.util.Arrays;import java.util.Random;public class DaoTes…

【渝粤题库】陕西师范大学700005 遗传学

《遗传学》作业 一、名词解释 &#xff11;&#xff0e;杂种优势 &#xff12;&#xff0e; 外显率 &#xff13;&#xff0e;罗伯逊易位 &#xff14;&#xff0e;上位效应   &#xff15;&#xff0e;互补测验 &#xff16;&#xff0e;表现度 &#xff17;&#xff0e;平衡…

通过示例了解Apache Ignite Baseline拓扑

点燃基准拓扑或BLT表示群集中的一组服务器节点&#xff0c;这些服务器节点将数据持久存储在磁盘上。 其中&#xff0c;N1-2和N5服务器节点是具有本机持久性的Ignite集群的成员&#xff0c;这些集群使数据能够持久存储在磁盘上。 N3-4和N6服务器节点是Ignite群集的成员&#x…

国家开放大学2021春1032成本管理题目

教育 教育 试卷代号&#xff1a; 1032 2021年春季学期期末统一考试 成本管理 试题 2021年7月 一、单项选择题&#xff08;本类题共20分&#xff0c;每小题2分&#xff09; 1.交互分配法一般在( )分配中使用。 A.直接材料费用 B.辅助生产费用 C.直接工资 D.在产品成本 2.采用品…

java synchronized 参数_synchronized 参数的理解

synchronized 是java中用来同步的方法&#xff0c;详细的就不介绍了。synchronized的用法为&#xff1a;synchronized(锁){代码块}这个锁是什么呢&#xff0c;我看了很多说法但没有一个能讲清楚的。通过一段时间的使用后逐渐发现了一些synchronized使用的规律使用synchronized是…

Spring Boot集成测试中@ContextConfiguration和@SpringApplicationConfiguration之间的区别

即使同时使用ContextConfiguration和SpringApplicationConfiguration批注以及SpringJUnit4ClassRunner来指定如何加载Spring应用程序上下文&#xff0c;它们之间也存在细微的差异。 尽管ContextConfiguration在加载应用程序上下文方面表现出色&#xff0c;但没有充分利用Spring…

【渝粤题库】广东开放大学 秘书理论与实务 形成性考核

&#x1f449;关注我,看答案&#x1f448; 选择题 题目&#xff1a;秘书的职责之一是服从上级&#xff0c;既然秘书要服从上级&#xff0c;那么即使发现上级有错误时也不能指出来。 题目&#xff1a;权利人对产品设计、工艺流程、配方、质量管理等方面的技术信息采取保密措施属…

【渝粤题库】广东开放大学 数据库技术安全 形成性考核

选择题 题目&#xff1a;6-1、与大数据密切相关的技术是&#xff08;&#xff09;。 题目&#xff1a;6-2、大数据应用需依托的新技术有&#xff08;&#xff09;。 题目&#xff1a;6-3、以下哪个不是大数据的特性&#xff08;&#xff09;。 题目&#xff1a;6-4、下列哪一项…

【渝粤题库】广东开放大学 PHP动态网站设计 形成性考核

选择题 题目&#xff1a; PHP 服务器脚本由_________分隔符包围&#xff1f; 题目&#xff1a; 下列说法不正确的是____________。 题目&#xff1a; PHP是一种跨平台、____________的网页脚本语言。 题目&#xff1a; PHP网站可称为____________。 题目&#xff1a; PHP…

vert.x_使用vert.x 2.0,RxJava和mongoDB创建simpe RESTful服务

vert.x中断了将近半年后发表了一篇新文章。 在本文中&#xff0c;我们将快速了解如何开始使用vert.x&#xff0c;更有趣的是&#xff0c;如何使用RxJava简化异步系统的编程。 我们将涵盖以下主题&#xff1a; 使用Maven创建一个空的vert.x项目 导入IntelliJ并创建一个简单的H…

java底层编程_万字长文!从底层开始带你了解并发编程,彻底帮你搞懂Java锁!

线程是否要锁住同步资源锁住 悲观锁不锁住 乐观锁锁住同步资源失败 线程是否要阻塞阻塞不阻塞自旋锁&#xff0c;适应性自旋锁多个线程竞争同步资源的流程细节有没有区别不锁住资源&#xff0c;多个线程只有一个能修改资源成功&#xff0c;其它线程会重试无锁同一个线程执行同步…

【渝粤题库】广东开放大学 会展英语 形成性考核

选择题 题目&#xff1a;_______ refers to attaching meaning to sense data and is synonymous with decoding.&#xff08;&#xff09;。 题目&#xff1a;依据平衡计分卡的思想&#xff0c;把组织的战略分成财务战略、客户战略、内部业务流程战略和 题目&#xff1a;Ameri…

【渝粤题库】广东开放大学 外贸会计 形成性考核

选择题 题目&#xff1a; 在实际业务中&#xff0c;FOB条件下&#xff0c;买方常委托卖方代为租船、订舱&#xff0c;其费用由买方负担。如到期订不到舱&#xff0c;租不到船&#xff08; &#xff09;。 题目&#xff1a; 在实际业务中&#xff0c;FOB条件下&#xff0c;买…

java怎么截取后8位数字_java如何更快生成00000000~99999999的8位数字保存到文件中?...

你的代码之所以会这么慢主要因为两个半半点&#xff1a;1&#xff1a;你循环多少次就打开多少次文件。2&#xff1a;你用了String.format("%08d", atLong)你应该先转换成String再用substring来整理....另外半点&#xff1a;你循环多了个0...并且还循环System.out.pri…

如何通过Rultor将Maven工件部署到CloudRepo

在我以前的文章中 &#xff0c;我描述了如何在Amazon S3中设置私有Maven存储库并通过Rultor进行部署。 如果您熟悉管理Amazon Web Services&#xff08;AWS&#xff09;&#xff0c; S3和AWS Identity and Access Management&#xff08;IAM&#xff09;的话&#xff0c;这是一…

【渝粤题库】广东开放大学 岭南文化概论专科 形成性考核

选择题 题目&#xff1a;中国由北而南最大规模的“移民潮”发生在&#xff08;&#xff09;代。 题目&#xff1a;位于五岭之一的大庾岭道上的粤北南雄()&#xff0c;是移民入粤的重要中转站。 题目&#xff1a;汉代所置的&#xff08;&#xff09;郡&#xff0c;管辖番禺.博罗…

【渝粤题库】广东开放大学 建筑施工技术 形成性考核

选择题 题目&#xff1a;以下土料不能用作填方的是&#xff08;&#xff09;。 题目&#xff1a;在地下水的处理方法中&#xff0c;属于降水法的是&#xff08;&#xff09;。 题目&#xff1a;在填方工程中&#xff0c;以下说法正确的是&#xff08;&#xff09;。 题目&#…

java 拉丁文 unicode_“java语言使用的是Unicode编码”是指的jvm?.java文件?

*.java (utf-8/gbk/...) -> *.class (utf-8) -> memory (utf-16)javac 编译中有参数可以制定源代码的编码-encoding Specify character encoding used by source files所以源码用其他编码都是可以的&#xff0c;最常见的是使用UTF-8.See also:在类文件中字符串也是以utf-…

【渝粤题库】广东开放大学 计算机应用基础(本) 形成性考核

选择题 题目&#xff1a;Windows的任务栏可用于________。 题目&#xff1a;Windows中可以设置、控制计算机硬件配置和修改显示属性的应用程序是________。 题目&#xff1a;在Windows中下面的叙述正确的是___________。 题目&#xff1a;计算机可以进行自动处理的基础是______…