偏向锁 / 轻量级 / 重量级、AQS、ReentrantLock、读写锁
一、Synchronized 四种锁状态无锁→偏向→轻量→重量1. 偏向锁核心偏向第一个拿到锁的线程无竞争直接拿锁触发单线程无竞争场景原理MarkWord 记录线程 ID下次直接进入无 CAS 开销撤销出现第二个线程竞争升级为轻量级锁开启JDK1.6 默认开启JDK15 后默认关闭2. 轻量级锁核心多线程交替执行不存在同时竞争原理自旋 CAS 抢锁不阻塞优点用户态执行不进入内核速度快缺点自旋消耗 CPU升级自旋失败→升级重量级锁3. 重量级锁核心多线程激烈竞争原理向操作系统申请内核态互斥锁未抢到锁线程阻塞休眠让出 CPU开销最大性能最低并发量大必走它状态升级顺序无锁 → 偏向锁 → 轻量级锁 → 重量级锁只能升级不能降级三者核心区别偏向锁单线程独享零 CAS轻量级锁交替执行自旋 CAS重量级锁并发争抢内核阻塞二、AQS 抽象队列同步器锁底层核心1. 作用Java 所有 JUC 锁的底层基石ReentrantLock、读写锁、CountDownLatch、Semaphore 全靠 AQS 实现2. 核心结构state 同步状态变量int0无锁0已加锁可重入次数CLH 双向阻塞队列抢锁失败线程入队排队等待唤醒两大核心模式独占锁同一时间只能一个线程拿锁ReentrantLock共享锁多线程同时拿锁读写锁、CountDownLatch3. 核心方法tryAcquire ()尝试获取独占锁tryRelease ()释放独占锁tryAcquireShared ()获取共享锁tryReleaseShared ()释放共享锁三、ReentrantLock 可重入独占锁1. 对比 synchronized相同可重入不同手动加锁解锁lock() / unlock()支持公平锁 / 非公平锁可中断等待、超时抢锁底层基于AQS2. 两种模式java运行// 非公平锁默认插队抢锁吞吐量高 new ReentrantLock() // 公平锁严格排队先来先得 new ReentrantLock(true)3. 可重入原理state 记录重入次数加锁 1解锁 - 1归 0 才算真正释放锁。4. 标准写法java运行lock.lock(); try { // 业务代码 } finally { lock.unlock(); // 必须finally释放 }四、读写锁 ReentrantReadWriteLock1. 设计思想读多写少场景专用读锁共享锁多个线程同时读并发高写锁独占锁写时独占禁止读写2. 四大互斥规则读与读共存读与写互斥写与读互斥写与写互斥3. 适用场景缓存、配置文件、商品库存、查询远大于修改4. 缺点容易出现写饥饿大量读线程一直占锁写线程一直等待5. 升级版StampedLock乐观读锁解决写饥饿性能更强面试极简背诵版Synchronized 锁膨胀偏向→轻量→重量单向升级不可降级偏向锁单线程优化轻量级自旋无阻塞重量级内核阻塞AQSJUC 锁底层靠 stateCLH 队列实现排队抢锁ReentrantLockAQS 实现可重入、公平非公平、手动锁