ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第039篇 synchronized 原理:对象头、锁升级与重量级锁

第039篇 synchronized 原理:对象头、锁升级与重量级锁 synchronized 这题的分水岭特别清楚:能答出"对象头 Mark Word + monitorenter"的人不少,能讲清"锁升级的四个阶段、偏向锁在 JDK 15 被废弃、以及为什么wait必须在锁内调用"的人很少。面试官问的就是后面这层。理解了升级路径与锁竞争的真实代价,这道题才算拿下来。先把结论放在前面:synchronized的锁信息记录在对象头的 Mark Word 里,字节码层面由monitorenter与monitorexit指令实现,进入时若对象未被锁定则把锁记录写进 Mark Word 并指向一个ObjectMonitor;同一线程重入时用重入计数递增,退出时递减归零才真正释放。 竞争加剧时锁会逐步膨胀:无竞争时靠 Mark Word 标记即可(偏向),轻度竞争用 CAS 自旋(轻量级),自旋失败转内核互斥锁(重量级)。机制拆解讲清升级路径这条主线。无竞争时,JVM 可以让 Mark Word 记录"锁偏向于某线程",该线程再进入只需比较线程 ID,几乎零成本——不过这条路径在 JDK 15 已被废弃并默认关闭,因为偏向锁在多线程竞争场景收益有限、却持续占用额外判断。轻度竞争下(预计很快能拿到锁),改用轻量级锁:在线程栈上生成 Lock Record,用 CAS 把 Mark Word 指向它,自旋若干次尝试加锁。 自旋失败则膨胀为重量级锁,线程被挂起交给内核调度,对象头记录指向ObjectMonitor,竞争线程进入等待队列。三者的取舍逻辑很清晰:能用用户态解决的就不进内核,能
返回列表