总览

硬件事务内存有潜力允许多个线程同时以推测方式访问相同的数据结构,并使缓存一致性协议确定是否发生冲突。 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

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

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

    java 内存同步 总览 硬件事务内存有可能允许多个线程同时以推测方式访问相同的数据结构,并使缓存一致性协议确定是否发生冲突. HTM旨在为您提供细粒度锁定的可伸缩性,粗粒度锁定的简单性以及几乎没有锁 ...

  2. java中为什么还要防止内存泄露_JAVA防止内存的泄漏什么意思,内存还能泄露?...

    展开全部 尽管java虚拟机和62616964757a686964616fe59b9ee7ad9431333166353066垃圾回收机制管理着大部分的内存事务,但是在java软件中还是可能存在内存泄 ...

  3. Java中一维数组的内存解析(浅显易懂,新手必看)

    1.初识JVM 要认识Java中一维数组的内存存储情况,首先应该简单了解一下JVM这个概念 1.1什么是JVM JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计 ...

  4. Java中获取CPU与内存利用率

    使用说明 代码示例 当我们需要获取当前机器的资源利用时,Java中如何获取呢?最方便的方式即使用com.sun.management.OperatingSystemMXBean来获取. 使用说明 虽然 ...

  5. 苹果删除照片不释放内存_新买的手机变得很卡?试试删除这3个文件夹,释放大量内存...

    手机内存是很多人在买手机时都会看重的一点,因为手机内存大就能够下载更多的应用,游戏.对一些喜欢玩游戏的人来说,肯定会追求内存大的手机,因为这样对系统的流畅度还有安装的游戏都有更多的空间. 一些新买的手 ...

  6. java 处理byte_java - 文件到Java中的byte [] - 堆栈内存溢出

    ===============>>#1 票数:1222 例: import java.io.File; import java.nio.file.Files; File file; // ...

  7. 如何使用布隆过滤器在Java中建立大容量的内存缓存

    背景 缓存是解决日常软件问题的重要概念. 您的应用程序可能会执行CPU密集型操作,而您又不想一次又一次地执行这些操作,而是只导出一次结果并将其缓存在内存中. 有时瓶颈是IO,例如您不想重复访问数据库, ...

  8. java cpu 内存_如何检查Java中的CPU和内存使用情况?

    如果你专门在JVM内存中寻找: Runtime runtime = Runtime.getRuntime(); NumberFormat format = NumberFormat.getInstan ...

  9. JAVA中的面向对象与内存解析_2

    构造方法(构造函数)   • 使用new +构造方法创建一个新的对象. • 构造函数是定义在Java类中的一个用来初始化对象的函数. • 构造函数与类同名且没有返回值. • 例如:Person类的构造 ...

最新文章

  1. 更改eclipse的Package Explorer的字体
  2. cxf客户端访问方式
  3. 扬州工业机器人外壳设计排名_工业交换机的外壳设计重要吗?
  4. (二)k-means算法原理以及python实现
  5. tesorflow 填充‘same’与‘valid’
  6. TypeError: 'numpy.ndarray' object is not callable
  7. PyTorch 1.4 最新版放出:支持Python2的最后一版,支持分布式模型并行、Java程序、移动端等多项新功能...
  8. MFC改变对话框背景颜色
  9. centos mate桌面_CENTOS7安装各种桌面系统 CENTOS安装桌面图形化GUI GNOME/KDE/Cinnamon/MATE/Xfce...
  10. fastjson 1.1.31 发布,Java 的 JSON 库
  11. 总是通过加班,来完成工作,那都是假象
  12. 分布式锁是啥?对比下redis和zk两种分布式锁的优劣?
  13. 欢庆博客达到V5级别,感恩所有程序员
  14. 22年PMP考试【全真敏捷试题】
  15. 信号链模拟芯片是什么?
  16. PC-DMIS 圆(环)型平面自动测量子程序
  17. Mapwingis添加图层,实现label
  18. 树莓派中怎么更新python_树莓派升级python的具体步骤
  19. 一些我平常用到的软件
  20. 掌握农业信息化核心 物联网助力智慧农业

热门文章

  1. linux-basic(9)文件与文件系统的压缩与打包
  2. java集合——树集(TreeSet)+对象的比较
  3. java插入排序_Java程序要插入排序
  4. apache.camel_Apache Camel 2.23发布
  5. jdk 9和jdk8_了解有关JDK9紧凑弦乐的信息(视频评论Charlie Hunt)
  6. viewpager默认界面_使用默认方法的界面演变–第一部分:方法
  7. java代码初体验_第一次Java 8体验
  8. 定制基元和DTO的(反)序列化和验证
  9. java ee maven_针对新手的Java EE7和Maven项目–第1部分–简单的Maven项目结构–父pom...
  10. spring集成jndi_Spring应用程序与JNDI连接池的集成测试