什么是自适应旋转 w.r.t 锁采集?

在提高固有锁的性能方面,给java 6带来的四个主要变化之一是Adapative Spinning技术。究竟什么是自适应旋转?它是自旋锁和互斥锁的组合吗?有人可以用一种易于理解的方式解释这种策略的有用性吗?默认情况下,该策略从JDK6开始可用。


答案 1

究竟什么是自适应旋转?

引用此 Java 6 性能页面

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

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

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

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

在演示的后面,有一张名为“自适应旋转”的幻灯片:

  • 先旋转后块策略
    • 尝试通过在 [多处理器] 系统上旋转来避免上下文切换
  • 旋转持续时间
    • 按监视器维护
    • 根据近期旋转成功/失败比率的历史而有所不同
  • 适应系统负载、并行性、应用模式
  • [多处理器]-礼貌旋转
  • 避免在徒劳的条件下旋转(所有者被阻止)

有趣的东西。


答案 2

推荐