synchronized 的自旋锁机制是什么
synchronized 在 java 6 之后引入了自适应自旋锁,用于在获取锁失败时避免立即挂起线程。当线程尝试获取对象监视器(monitor)失败时,它会先进行一定次数的循环等待(即自旋),而不是直接让出 cpu 并进入阻塞状态。如果持有锁的线程能在自旋期间释放锁,当前线程就能成功获取锁,从而避免了上下文切换带来的性能开销。这种机制假设大多数锁的持有时间很短,且竞争不激烈。

自旋锁如何判断是否继续自旋
自适应自旋锁的核心在于“自适应”,它不会固定自旋次数,而是根据前一次在同一对象上的自旋成功率来调整。如果之前自旋成功获取了锁,说明该锁的竞争程度较低,JVM 会适当增加自旋次数;反之,如果自旋失败或从未成功过,JVM 可能会减少甚至取消自旋,直接进入阻塞状态。此外,自旋过程还会检查持有锁的线程状态,如果持有锁的线程正在运行,自旋更有意义;如果持有锁的线程已经挂起,自旋通常会立即终止。

自旋锁在 synchronized 中的具体实现位置
在 HotSpot JVM 中,自旋逻辑主要实现在 ObjectMonitor 类的 enter() 方法中。当线程通过 CAS 操作尝试获取 _owner 字段失败后,会进入自旋循环。代码中会使用 Unsafe 提供的原子操作来不断重试获取锁,同时结合 SpinYield 或 SpinPause 等指令来优化 CPU 行为。自旋结束后,如果仍未获取到锁,线程会被放入 EntryList 队列并挂起。这一过程是 synchronized 从重量级锁向轻量级锁过渡及优化的关键部分,确保了在高并发短临界区场景下的效率。
立即学习“Java免费学习笔记(深入)”;


















