Java中的硬件事务性内存,或者为什么同步将再次变得很棒

总览

硬件事务内存有潜力允许多个线程同时以推测方式访问相同的数据结构,并使缓存一致性协议确定是否发生冲突。 HTM旨在为您提供细粒度锁定的可伸缩性,粗粒度锁定的简单性以及几乎没有锁定的性能。 如果JVM支持,则您的程序或库是使用过程粒度锁定编写的,这可能意味着您的应用程序只需很少的更改即可扩展到更多的内核。

虽然在C和C ++中添加对此的支持并非易事,但可以在不更改字节码的情况下添加对JVM生成的本机代码的支持。

简而言之,这可以允许许多线程以推测方式并发地为锁执行同步块,甚至并发写入,并且处理器可以确定这是否是问题,然后重复执行该块直到没有问题为止。

什么是硬件事务内存,它将花费多少?

硬件事务内存已经存在了一段时间,但是直到最近它才成为主流。 随着英特尔为其第四代i3 / i5 / i7处理器(Haswell)和其E3-1200 v3(最多4核,一个插槽ATM)系列处理器中的某些处理器提供支持,新的基于Intel的计算机可广泛使用。 可能是在今年下半年或明年,我们才能看到更多的核心,这意味着HTM将会真正发挥作用。 AFAIK和AMD计划很快添加此功能。

顺便说一句,Azul的Vega系统已经使用了这项技术已有近十年的时间,我希望Azul能够最好地首先在JVM中实现该技术。

您将购买(也许已经购买)的硬件将执行此操作。 许多新型号的笔记本电脑都具有Haswell处理器,因为它们显着改善了功耗。

如何运作?

Java中经常使用同步块,以防万一。 为了简化代码,这些锁通常比最佳锁要粗糙得多。例如,对于任何操作,Hashtable锁整个对象/映射,而具有精细锁定的ConcurrentHashMap锁。 编写细粒度锁定很难正确,因此更容易出错。 硬件事务存储的目标是支持过程粒度锁定,但要获得精细粒度锁定的好处。 这对于重新优化代码不可行的代码特别有用。

private final Map map = new HashMap<>(); public synchronized PooledObject acquireObject(String key) {PooledObjectobject = map.get(key);if (object == null)map.put(key, object = new PooledObject());return map;
}

您可能会想到这种情况

  • 只看地图
  • 更新地图,但是在不同的地方,例如不同的键。
  • 很少尝试一次在两个线程中更新同一密钥。

你想要的是

  • 线程之间的并发执行。
  • 与没有锁定的代码相比,开销很小。
  • CPU或JVM可以完成所有工作来优化此功能,即您不必更改代码。

如果没有HTM,则即使大多数情况是读取操作,同步块也需要获得锁并强制执行序列化访问。

使用HTM,字节码可以变成伪码,像这样

public PooledObject acquireObject(String key) {int code;do {xbegin();PooledObjectobject = map.get(key);if (object == null)map.put(key, object = new PooledObject());return map;} while((code = xend()) == RETRYABLE);if (code != DONE) {// take corrective action such as// obtain a normal lock and repeat}
}

XEND指令划定了检查缓存中的推测性读集和写集的终点,以查看其中是否有被其他CPU /线程修改过的任何被访问的缓存行。 如果不是,则所做的更改将被提交。 否则,将放弃所有更改,并且可以重复循环。

注意:回滚事务意味着撤消更改,甚至可能意味着回滚没有明显副作用的对象创建。 如果确实有副作用,则可以使用XABORT指令来触发事务中止,并且需要运行后备代码。

比较和交换限制为64位,这些事务的限制是多少?

限制是您可以在L1缓存中存储的行数。 最多32 KB。 如果您有超线程,则可能只有一半,即16 KB。 同样,L1缓存是8路关联的,因此在最坏的情况下,哈希到同一存储桶的9条缓存行可能导致事务失败。 (具有超线程的情况较少),尽管如此,它比CAS 64位或128位的2CAS高得多,并且灵活得多。

使用后退编写此事务锁定结构,以使用C之类的语言添加样板和重复代码。

结论

这种模式的优点在于它可以应用于已经编译过的Java代码,并且可以作为开源库使用。 与需要大量返工才能利用此功能的C代码不同,Java程序无需重新编译即可利用HTM。 我们需要的是更改JVM。

注释(对我之前所说的内容进行了一些更正/澄清)

为了我; 我相信“酷”技术会引起广泛的兴趣,即使没有证明广泛的实用性。 我相信在主流JVM中实现此功能将挑战甚至是经验丰富的开发人员“了解”多线程编程的知识。

虽然某些Haswell处理器中提供了Intel TSX,但并非所有Haswell处理器中都提供了Intel TSX。 您应该在ARK上与Haswell进行联系,并查看Intel TSX-NI是Yes

已经注意到,这对于调优的代码可能没有太大的区别。 英特尔TSX的设计师Ravi Rajwar在QCon SF 2012上的主题为 “ 机械同情”的主题 是“英特尔的下一代微体系结构代号Haswell ”。 如果您看一下第29页,它向我建议,细粒度的代码无论如何都将在内核之间很好地扩展,并且不会获得太多收益。 TSX可能会帮助您的是粗粒度锁定。

有关更多技术细节,我建议您阅读Gil Tene在机械同情小组上的帖子 。 与我见过的任何人相比,他在调优JVM以支持HTM方面都有第一手的经验。

参考文献

  • 投机锁定:打破规模壁垒(JAOO 2005),由阿祖尔( Azul)的吉尔·泰恩(Gil Tene)撰写。
  • Sun Microsystems的David Dice,Yossi Lev,Mark Moir,Daniel Nussbaum,Marek Olszewski 的商业硬件事务存储实现的早期经验(2009年10月) 。
  • Wikipedia上的事务同步扩展
  • 基准:SiSoftware的Haswell的TSX和内存事务处理吞吐量(HLE和RTM)
  • 享受来自英特尔的英特尔®事务同步扩展的乐趣
  • 事务性内存支持:英特尔的speculative_spin_mutex
  • Johan De Gelas 对英特尔Haswell事务同步扩展的理解。

参考: Java中的硬件事务存储,或者为什么同步将变得凉爽 ,我们的JCG合作伙伴 Peter Lawrey在Vanilla Java博客上发表了文章。

翻译自: https://www.javacodegeeks.com/2014/02/hardware-transactional-memory-in-java-or-why-synchronized-will-be-cool-again.html

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

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

相关文章

mysql5.7乱码_mysql5.7中解决中文乱码的问题

在使用mysql5.7时&#xff0c;会发现通过web端向数据库中写入中文后会出现乱码&#xff0c;但是在数据库中直接操作SQL语句插入数据后中文就显示正常&#xff0c;这个问题怎么解决呢&#xff1f;此处不对mysql的数据编码过程和原理进行讲解&#xff0c;如果有兴趣的同学可以自己…

a 链接点击下载

1. 将链接设置为.zip 结尾2.在a元素中添加download 属性,&#xff08;目前只有chrome、firefox和opera支持&#xff09; function download(src) { var $a $("<a></a>").attr("href", src).attr("download", "img.png");…

Codeforces Global Round 2 D. Frets On Fire (动态开点线段树,沙雕写法)

题目链接&#xff1a;D. Frets On Fire 思路&#xff1a;明明可以离散化二分写&#xff0c;思路硬是歪到了线段树上&#xff0c;自闭了&#xff0c;真实弟弟&#xff0c;怪不得其他人过得那么快 只和查询的区间长度有关系&#xff0c;排完序如果相邻的两个点的差值小于等于查询…

hdu 1069 Monkey and Banana 【动态规划】

题目 题意&#xff1a;研究人员要测试猴子的IQ&#xff0c;将香蕉挂到一定高度&#xff0c;给猴子一些不同大小的箱子&#xff0c;箱子数量不限&#xff0c;让猩猩通过叠长方体来够到香蕉。 现在给你N种长方体&#xff0c; 要求&#xff1a;位于上面的长方体的长和宽 要小于 …

使用带有OAuth2的Web应用程序和使用JWT来调用API – WSO2 API Manager

在这篇文章中&#xff0c;我将分享我在WSO2 API管理器&#xff08;API-M&#xff09;方面的经验和理解&#xff0c;以解决该行业中非常普遍和有用的情况。 简要地说明以下流程。 公开了一个API&#xff0c;供应用程序开发人员在API Manager&#xff08;可为API添加访问控制&a…

git仓库的推送问题

git仓库的推送问题 推送问题 先说结论。先拉取&#xff0c;pull拉取完之后再commi提交。 如果先提交&#xff0c;再拉取的话&#xff0c;git会提示项目冲突&#xff0c;此时需要先解决冲突&#xff0c;而某些时候&#xff0c;我们不一定会处理好所有的冲突&#xff0c;而导致…

scala的插值器

Scala 为我们提供了三种字符串插值的方式&#xff0c;分别是 s, f 和 raw。它们都是定义在 StringContext 中的方法。 s 字符串插值器 val a 2println(s"小明今年$a 岁了") f 字符串插值器 它除 s 的功能外(不指定格式就和 s 一样)&#xff0c;还能进行格式化输出&a…

src/main/resorces applicationContext.xml

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http://www.springframework.org/schema/context"xmlns:aop"http://www.springframework.org/schem…

layui的checkbox示例

1.html页面: var isSkipcheckbox ;if (appOptions.isSkip ! "0") {isSkipcheckbox checked"";}<input type"checkbox" name"" lay-filter"type" lay-skin"primary" title"是否允许跳过" value&quo…

confluence 编辑器加载_Onlyoffice集成Confluence的工作原理

onlyoffice 与 confluence集成使用&#xff0c;使用onlyoffice connector for confluence 插件对接confluence插件在confluence中创建了一个新的按钮动作&#xff0c;Edit in OnlyOffice 用来处理office文档。这允许多用户实时协作并且将变更返回到confluence中。具体工作原理&…

红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...

上周&#xff0c;我发布了一个博客&#xff0c;重点介绍了我的演示文稿&#xff0c;该演示文稿展示了我们在BRMS和BPMS平台内完成的工作&#xff0c;Drools和jBPM项目的产品化版本所产生的丰富客户端平台。 该演示文稿是所有屏幕截图和视频&#xff0c;您可以在此处找到博客和幻…

AJAX的内容

第 1 章&#xff1a;原生 AJAX 1.1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是…

洛谷P1099 树网的核

传送门 80分 $ Floyd $ 树的直径可以通过枚举求出。直径的两个端点$ maxi,maxj $ &#xff0c;由此可知对于一个点 $ k $ &#xff0c;如果满足 $ d[maxi][k]d[k][maxj]d[maxi][maxj] $ 那么 $ k $ 点一定在直径上。分别枚举位于直径上的起点 $ s $ 与终点 $ t $ 。 $ ecg $ 定…

HTML中直接写js 函数

1.在HTML中直接写JS函数: <body οnlοad"javascript:{window.location.hrefhttp://www.baidu.com/}">2.写在script标签里的话就是&#xff1a; <script>function tiao(){window.location.href"http://www.baidu.com/"}</script><!--…

选择通过更改内容类型返回的详细程度,第二部分

在上一篇文章中 &#xff0c;我们研究了使用MOXy的功能来控制特定实体的数据输出级别。 这篇文章着眼于Jersey 2.x提供的抽象&#xff0c;它允许您定义一组自定义的批注以具有相同的效果。 与之前一样&#xff0c;我们几乎没有什么琐碎的资源可以返回Jersey将为我们转换为JSON…

jQuery.ajax success 与 complete 区别

作者QQ&#xff1a;1095737364 QQ群&#xff1a;123300273 欢迎加入&#xff01; 天天用,不知所以然: $.ajax({type: "post",url: url,dataType:html,success: function(data) { },complete: function(XMLHttpRequest, textStatus) { },error: function(){}}…

vscode如何设置回车自动换行缩进?

要解决这个问题&#xff0c;首先打开设置&#xff0c;查找tabsize&#xff0c;进入settings.json。 把"editor.autoIndent"的属性值改为false&#xff0c;即"editor.autoIndent": "false"&#xff0c;就可以了。

vue 过滤器使用的传参说明

在table中&#xff0c;需要对obj的数据类型进行文字转换&#xff0c;例如后台接口返回的姓别值&#xff1a;1&#xff0c;2。其中需要页面根据字典需要把1》男&#xff0c;2》女进行转换。 以前的习惯是每一个过滤方法都写一个方法进行转换&#xff0c;例如&#xff1a; 页面代…

leetcode 970. 强整数(Powerful Integers)

目录 题目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;解法&#xff1a;题目描述&#xff1a; 给定两个正整数 x 和 y&#xff0c;如果某一整数等于 x^i y^j&#xff0c;其中整数 i > 0 且 j > 0&#xff0c;那么我们认为该整数是一个强整数。 返回值小于或等…

ruby sinatra mysql_一分钟开始持续集成之旅系列之:Ruby + Sinatra 应用

前言现代软件工程越来越复杂&#xff0c;而开发效率随着软件复杂度增加呈指数型下降。为在提高开发效率的同时也能保证质量&#xff0c;越来越多团队开始践行敏捷开发方法。持续集成是敏捷开发的重要实践之一。它倡导团队通过自动化构建工具频繁地验证软件可用性&#xff0c;从…