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

时间:2013-12-19 19:06:48

标签: java multithreading concurrency java.util.concurrent

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

1 个答案:

答案 0 :(得分:13)

  

什么是自适应旋转?

引用此Java 6 performance page

  

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

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

有关详细信息,性能文档引用了Dave Dice撰写的题为Synchronization in Java SE 6 (HotSpot)的演示文稿。第一张幻灯片标题为“竞争成本(可扩展性+延迟)”:

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

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

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

有趣的东西。