Synchronized中的偏向锁、轻量级锁、重量级锁有何区别?

1 个回答

  • 王青
    上了生活的贼船,就要做快乐的海盗。
    # 偏向锁、轻量级锁、重量级锁的区别 ## 作用 - 三者都是 synchronized 在不同竞争情况下使用的锁状态。 - JVM 会根据线程竞争程度进行锁升级,从而在无竞争、轻度竞争和激烈竞争场景之间权衡性能。 - 升级路径通常是:偏向锁 → 轻量级锁 → 重量级锁。 ## 原理 - **偏向锁** - 适用于只有一个线程反复获取锁、基本没有竞争的场景。 - 锁会偏向第一个获取它的线程,并在对象头的 Mark Word 中记录线程 ID。 - 该线程再次进入同步块时,不需要重复执行复杂的同步操作,从而降低加锁和解锁开销。 - 当其他线程尝试竞争锁时,偏向状态无法继续维持,会撤销偏向并升级。 - **轻量级锁** - 适用于多个线程交替执行、竞争不激烈,并且线程持有锁时间较短的场景。 - JVM 会在当前线程栈帧中创建锁记录,并通过 CAS 操作尝试更新对象头的 Mark Word。 - 获取成功后,线程以轻量级方式进入同步块。 - 如果 CAS 失败,说明存在竞争;线程通常会先自旋等待锁释放,避免立即阻塞。 - 自旋仍无法获得锁或竞争加剧时,会升级为重量级锁。 - **重量级锁** - 适用于竞争激烈、同步块执行时间较长或自旋成本过高的场景。 - 依赖底层操作系统的互斥量实现线程同步。 - 未获取到锁的线程会被阻塞并进入等待状态,之后由操作系统负责唤醒。 - 线程阻塞和唤醒涉及用户态与内核态切换,开销最大,但适合长时间、高竞争的同步场景。
    发布于 2026-10-21 23:34 •IP属地 江苏
    举报
    评论
    收藏