synchronized vs Lock

§2.2.1 synchronized vs Lock

考察意图:能否理解synchronized和Lock的原理差异和选型依据。

回答样板

synchronized是JVM内置锁,由monitorenter/monitorexit字节码指令实现,自动释放锁,非公平锁,适合简单同步场景。

Lock(ReentrantLock)是JDK API级别的锁,通过AQS(AbstractQueuedSynchronizer)实现,必须手动释放(finally中unlock),支持公平锁、可中断获取锁、尝试获取锁超时、多条件变量(Condition),适合复杂同步场景。

JDK 6以后synchronized做了锁升级优化——偏向锁 → 轻量级锁 → 重量级锁,单线程竞争场景下性能差距不大。

追问预判

追问:“synchronized的锁升级过程具体是怎样的?”

无锁状态 → 偏向锁:Mark Word存储线程ID,同一线程重入不走CAS,直接判断线程ID一致 → 轻量级锁:多个线程交替竞争时,自旋CAS尝试获取锁,Mark Word存锁记录指针 → 重量级锁:自旋超过阈值(默认10次或自适应),升级为OS互斥量,线程阻塞挂起。本质是空间换时间——偏向锁和轻量级锁尽力减少内核态切换,重量级锁是兜底方案。

陷阱提示:说不清锁升级过程;以为synchronized一直是重量级锁。

本作品采用 CC BY-NC-SA 4.0 协议进行许可
使用 Hugo 构建
主题 StackJimmy 设计