在改进内部锁的性能方面为Java 6带来的四个主要变化之一是 Adapative Spinning 技术。什么是自适应纺纱?它是spinlocks和互斥锁的组合吗?有人可以用一种易于理解的方式解释这种策略的有用性,默认情况下可以从JDK6开始提供。
答案 0 :(得分:13)
什么是自适应旋转?
自适应旋转是一种优化技术,其中线程尝试进行竞争同步输入操作时使用两阶段旋转然后块策略。这种技术使线程能够避免影响性能的不良影响,例如Translation Lookaside Buffers (TLBs)的上下文切换和重新填充。它是“自适应的”,因为旋转的持续时间是由政策决定决定的,这些决策基于诸如同一监视器上的最近旋转尝试的成功率和/或失败以及当前锁拥有者的状态等因素。
因此线程最初尝试旋转几次尝试在实际阻塞之前获取锁定。然后在将来它使用先前的成功/失败指标来自适应地确定它是否应该尝试旋转或阻塞。旋转会浪费CPU时间,而阻塞可能会导致上下文切换,并且线程可能会等待更长的时间。目标是尝试根据过去的行为优化这两个问题。
有关详细信息,性能文档引用了Dave Dice撰写的题为Synchronization in Java SE 6 (HotSpot)的演示文稿。第一张幻灯片标题为“竞争成本(可扩展性+延迟)”:
在演示文稿的后面有一张名为“自适应旋转”的幻灯片:
有趣的东西。