Java 8 StampedLocks与ReadWriteLocks和同步

Blog_key_

同步部分就像访问您的岳父母。 您希望尽可能少出现。 关于锁定,规则是相同的–您想花费最短的时间在关键区域内获取锁定,以防止形成瓶颈。

锁定的核心语言惯用法一直是用于方法和离散块的synced关键字。 这个关键字实际上已硬连接到HotSpot JVM中。 我们在代码中分配的每个对象,无论是String,Array还是成熟的JSON文档,都在本机GC级别的标头中内置锁定功能。 对于JIT编译器(根据特定锁的特定状态和争用级别来编译和重新编译字节码)也是如此。

同步块的问题在于它们全有还是全无 -关键部分中不能有多个线程。 在消费者/生产者方案中,这尤其令人a舌,其中一些线程试图专门编辑一些数据,而另一些线​​程只是试图读取数据并且可以共享访问权限。

ReadWriteLocks旨在成为此的完美解决方案。 您可以指定哪些线程阻止其他所有人(作家),以及哪些线程与其他人一起使用以消费内容(读者)。 一个快乐的结局? 不怕。

与同步块不同,RW锁不是JVM内置的,并且具有与凡人代码相同的功能。 尽管如此,要实现锁定习惯,您仍然需要指示CPU自动执行特定操作或以特定顺序执行操作,以避免出现竞争情况。 传统上,这是通过进入JVM的神奇门户漏洞- 不安全的类来完成的。 RW锁使用比较和交换(CAS)操作将值直接设置到内存中,作为其线程排队算法的一部分。

即便如此,RWLocks仍然不够快,有时甚至被证明确实很慢 ,以至于不值得为此烦恼。 但是,正在寻求帮助,JDK的好伙伴们没有放弃,现在又有了新的StampedLock 。 该RW锁采用了Java 8 JDK中新增的一组算法和内存隔离功能,以帮助使此锁更快,更可靠。

它兑现了诺言吗? 让我们来看看。

使用锁。 从表面上看,StampedLocks使用起来更复杂。 他们采用的邮票概念是很长的值,可以用作任何锁定/解锁操作使用的票证。 这意味着要解锁R / W操作,您需要为其传递相关的锁定标记。 通过错误的印章,您将面临例外甚至更糟的意外风险。

另一个需要牢记的关键是,与RWLocks不同,StampedLocks 不可重入 。 因此,尽管它们可能更快,但它们有一个缺点,那就是线程现在可以使自己陷入僵局。 实际上,这意味着比以往任何时候都更应该确保锁和图章不会逸出其封闭的代码块。

long stamp = lock.writeLock();  //blocking lock, returns a stamptry {write(stamp); // this is a bad move, you’re letting the stamp escape
}finally {lock.unlock(stamp);// release the lock in the same block - way better
}

我对这种设计的另一个讨厌之处是,邮票被用作长期价值,对您实际上没有任何意义。 我希望使用锁定操作来返回一个描述印记的对象-其类型(R / W),锁定时间,所有者线程等。这将使调试和记录更加容易。 但是,这可能是有意的,它旨在防止开发人员在代码的不同部分之间传递标记,并且还节省了分配对象的成本。

乐观锁 。 就此锁的新功能而言,最重要的部分是新的乐观锁模式。 研究和实践经验表明,读操作在大多数情况下都无法与写操作抗衡。 结果,获得一个成熟的读锁可能被证明是过大的。 更好的方法可能是继续执行读取,并在读取的最后查看该值是否实际上已被修改。 如果是这种情况,您可以重试读取,或升级到较重的锁。

long stamp = lock.tryOptimisticRead(); // non blockingread();if(!lock.validate(stamp)){ // if a write occurred, try again with a read locklong stamp = lock.readLock();try {read();}finally {lock.unlock(stamp);}
}

选锁的最大麻烦之一是,它在生产中的实际行为将根据应用程序状态而有所不同。 这意味着锁定习语的选择不能凭空完成,而必须考虑代码将在其下执行的实际条件。

并发读取器线程与写入器线程的数量将更改您应使用的锁–同步段或RW锁。 由于这些数字在JVM的生命周期中会发生变化,因此这变得更加困难,具体取决于应用程序状态和线程争用。

为了说明这一点,我对不同锁定级别和R / W线程组合下的四种锁定模式进行了压力测试-同步,RW锁定,Stamped RW锁定和RW乐观锁定。 读取器线程将消耗计数器的值,而写入器线程将其从0递增到1M。

5个读取器与5个写入器堆叠5个并发读取器和5个写入器线程,我们看到加盖的锁发光了,性能比同步提高了3倍。 RW锁定也表现良好。 奇怪的是,乐观锁在表面上应该是最快的,但实际上却是最慢的

04

1 0个读者与10个作家:接下来,我将争用级别提高到10个作家和10个读者线程。 在这里,事情开始发生重大变化。 RW锁现在比在相同级别上执行的加盖和同步锁一个数量级。 请注意,令人惊讶的是乐观锁仍然是慢速加盖的RW锁。

01

16位读者与4位作家:接下来,我保持较高的竞争水平,同时又使平衡趋于有利于读者线程:16位读者与4位作家。 RW锁继续说明了其被替换的原因- 速度慢一百倍 。 Stamped和Optimistic的性能很好,同步性也不差。

02

19位读者与1位读者:最后,我研究了单个作者线程对19位读者的影响。 请注意,结果要慢得多,因为单线程需要更长的时间才能完成工作。 在这里,我们得到一些非常有趣的结果。 毫不奇怪,RW锁需要无穷大才能完成。 但是,冲压锁定的性能并没有好得多……乐观锁定显然是赢家,比RW锁定高100倍。即使如此,请记住,这种锁定方式可能会使您失败,因为在此期间可能会发生写入器。 我们忠实的老客户,同步化继续取得可喜的成果。

03

完整的结果可以在这里找到……硬件:MBP四核i7。

基准代码可以在这里找到。

结论

似乎平均而言,内在同步锁仍可提供总体上最佳的性能。 即使这样,这里的意思并不是说它将在所有情况下都表现最佳。 主要是为了表明, 将代码投入生产之前 ,应该基于测试预期的争用级别以及读取器和写入器线程之间的划分来选择锁定习惯用法。 否则,您将冒着严重的生产调试痛苦的风险。

在此处了解有关StampedLocks的更多信息 。

对基准有疑问,意见或建议吗? 让我知道!

翻译自: https://www.javacodegeeks.com/2014/06/java-8-stampedlocks-vs-readwritelocks-and-synchronized.html

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

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

相关文章

MSN on 2/16/2009

转载于:https://www.cnblogs.com/zxlin25/archive/2009/02/16/1391207.html

开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容,本篇随笔继续这个步骤,逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程,包括证书的IIS端口绑定&#x…

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中,控制成员(变量、方法、类等)可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定: 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

Web API应用架构设计分析(1)

Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架, ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。本文主要以AS…

MapXtreme2008中操作矢量符号和定制符号

本文部分说明内容摘自网络文章,经过本人在MapXtreme2008中编写相关的演示例子,详细说明如何操作MapXtreme2008提供的矢量符号和定制符号。 MapXtreme 在其安装过程中自动安装 10 种 MapInfo 特定的 TrueType 字体。这些字体为用户提供了字形符号选择&am…

转载:97特瑞心得

单位里无聊打着玩的心得,写了段时间了,基本是哪天想到什么就打上去,狗屁不通的地方请大家包涵。97特瑞玩了有10年多了吧,97刚出来的时候就玩的特瑞,别人都八神,萝卜特,克拉克的时代我就坚持用特瑞&#xff…

吸气剂/设定者。 邪恶。 期。

从2003年开始,艾伦霍鲁布(Allen Holub)讨论了为什么吸气剂和塞特方法是邪恶的著名文章,关于吸气剂/塞特方法是否是反模式,应该避免使用,还是我们在面向对象中不可避免地需要它,这是一个古老的争…

【原】.Net创建Excel文件(插入数据、修改格式、生成图表)的方法

1.添加Excel引用 可以在.Net选项卡下添加Microsoft.Office.Interop.Excel引用,或在COM下添加Microsoft Excel 12.0 Object Library。它们都会生成Microsoft.Office.Interop.Excel.dll。 2.创建Excel。 有两种方法创建一个Excel Workbook实例。 1.需要一个模板文件&…

求助:安装程序无法创建一个DCOM用户帐号来注册.....\valec.exe

http://support.microsoft.com/kb/257413/ 这是Visual Studio的一个BUG,只出现在Windows 2000/XP下。如果你不使用Visual Studio Analyzer,可以在安装时选择Custom,然后在Enterprise Tools中清除掉Visual Studio Analyzer。再安…

js中split()和join()的用法

Split()方法:把一个字符串分割成字符串数组 如上所示:把字符串a按空格分隔,得3个字符串数组。 在如: var a”hao are you” a.split(“”); 得到[h,a,o,a,r,e,y,o,u]; Join方法: 把数组中的所有元素转换为一个字符串 如上图所…

IT行业经典面试题,121套面试题

IT行业经典面试题,121套面试题 资源大小: 580.80KB资源类型:发布人: eyelife 发布日期: 2天前Tag: 名企,计算机 资源分: 10下载人数: 857 4.33/347人评分 12 3 4 5 评论 分享…

词云第一次实践,参考学校老师讲的一些知识点还有网上大佬的代码实现

from wordcloud import WordCloudimport cv2import jiebawith open(1906月考.txt, r, encodingutf-8) as f: # 以读的方式打开词云参考的文档 text f.read() # 阅读cut_text .join(jieba.cut(text)) # 通过jieba库的cut精确模式进行分词# 得到词云形状color_mask cv2…

Spring Integration 4.0:完整的无XML示例

1.简介 Spring Integration 4.0终于发布了 ,并且此版本具有非常好的功能。 本文介绍的一种可能性是完全不使用XML即可配置集成流程。 那些不喜欢XML的人仅使用JavaConfig就可以开发集成应用程序。 本文分为以下几节: 介绍。 流程概述。 弹簧配置。 …

CSS伪类的三种写法

今天逛蓝色时&#xff0c;无意发现了有人讨论伪类的正确写法&#xff0c;让我对伪类的认识也更清晰了&#xff0c;转贴于此&#xff0c;以备日后查询(原贴当时没记下地址&#xff0c;已经记不得了) Code<style>a.tb{text-decoration:none;}a.tb:link{color:#FF9900;}a.tb…

如何通过示例在Java中使用CopyOnWriteArraySet

CopyOnWriteArraySet是CopyOnWriteArrayList类的弟弟。 这些是专用集合类&#xff0c;这些类是在JDK 1.5上添加的&#xff0c;以及它们最流行的表亲ConcurrentHashMap 。 它们是并发收集框架的一部分&#xff0c;位于java.util.concurrent包中。 CopyOnWriteArraySet最适合作为…

生成器

一、什么是生成器 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#xff0c;列表容量是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#xff0c;如果我们仅仅需要访问前面几个元素&#…

面向对象的三大特征 封装继承多态

面向对象设计 和开发程序的好处 交流更加流畅 、提高设计和开发效率 封装将类的某些信息隐藏在类内部&#xff0c;不允许外部程序直接访问&#xff0c;而是通过该类提供的方法来实现对隐藏信息的操作和访问私有化属性 提供公有化的访问方法 保证数据的安全性封装的步骤 …

Spring / Hibernate应用程序的性能调优

对于大多数典型的Spring / Hibernate企业应用程序&#xff0c;应用程序性能几乎完全取决于其持久层的性能。 这篇文章将讨论如何确认我们是否存在“数据库绑定”应用程序&#xff0c;然后逐步讲解7个经常使用的“快速取胜”技巧&#xff0c;这些技巧可以帮助提高应用程序性能。…

我的学习开发环境,呵呵!

今天到电子市场去&#xff0c;花了近700块&#xff0c;弄了块ARM的学习单板&#xff0c;再也不用去搞什么虚拟机了&#xff01; 简单的看了一下开发手册&#xff0c;还有点麻烦&#xff0c;可能得花点时间去把它搞清楚&#xff01; 但这块单板的功能还是很强的&#xff0c;基本…

Jsの练习-数组常用方法

1. join() 方法&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…