老版本例如jdk1.6可以参数-XX:PreBlockSpin=10来指定自旋次数,后面jdk升级后会动态自适应自旋;会根据CPU核数,锁竞争情况,历史成功率来动态调整自旋次数。
对应的决策过程如下:
123456789101112131415
尝试CAS ↓成功 → 继续轻量锁 or失败 → 自旋N次 ↓成功 → OK or失败 → 看: - 持锁时间长? - 等待线程多? - 历史失败多?满足任意严重情况 ↓升级为重量锁(OS Mutex)