§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一直是重量级锁。