什么是自适应旋转wrt锁定采集?

Gee*_*eek 13 java concurrency multithreading java.util.concurrent

关于提高内在锁的性能,Java 6带来的四个主要变化之一是Adapative Spinning技术.什么是自适应纺纱?它是自旋锁和互斥锁的组合吗?有人可以用一种易于理解的方式解释这种策略的有用性,默认情况下可以从JDK6开始使用.

Gra*_*ray 13

什么是自适应纺纱?

引用此Java 6性能页面:

自适应旋转是一种优化技术,其中线程尝试进行竞争同步输入操作时使用两阶段旋转然后块策略.该技术使线程能够避免影响性能的不良影响,例如上下文切换和转换后备缓冲区(TLB)的重新填充.它是"自适应的",因为旋转的持续时间是由基于诸如同一监视器上的最近旋转尝试的成功率和/或失败以及当前锁定所有者的状态等因素的策略决定来确定的.

因此线程最初尝试旋转几次尝试在实际阻塞之前获取锁.然后在将来它使用先前的成功/失败指标来自适应地确定它是否应该尝试旋转或阻塞.旋转会浪费CPU时间,而阻塞可能会导致上下文切换,并且线程可能会等待比必要时间更长的时间.目标是尝试根据过去的行为优化这两个问题.

有关更多详细信息,性能文档引用了Dave Dice 此标题为" Java SE 6中的同步(HotSpot)"的演示文稿.第一张幻灯片标题为"竞争成本(可扩展性+延迟)":

  • 上下文切换非常昂贵
  • 无界纺纱是不可接受的
  • 通过自适应旋转地址

在演示文稿的后面有一张名为"自适应旋转"的幻灯片:

  • 旋转然后阻止策略
    • 尝试通过在[多处理器]系统上旋转来避免上下文切换
  • 旋转持续时间
    • 每个监视器维护
    • 根据旋转成功/失败率的近期历史而变化
  • 适应系统负载,并行性,应用程序模式
  • [多处理器] -polite纺纱
  • 避免在无用条件下旋转(所有者被阻止)

有趣的东西.

  • 对于对细节感兴趣的人,代码中有趣的部分(即 HotSpot)位于 objectMonitor.cpp 中。实际上,它在长评论中对自适应旋转有很好的解释(搜索“自适应旋转支持”)。很想发布整个评论,但不确定这作为一个完整的答案有多大用处,所以这是妥协。实际代码位于“ObjectMonitor::TrySpin_VaryDuration”中,适合那些对诸如减少总线流量以实现一致性等血腥细节感兴趣的人。 (2认同)