你好我是fengxin_rou这是我的个人主页fengxin_rou的主页❄️欢迎查看我的专栏我的专栏《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》目录synchronized 底层原理synchronized 锁升级流程无锁偏向锁2. 偏向锁单线程无竞争偏向锁撤销3. 轻量级锁自旋锁短时间、轻度竞争轻量级锁竞争自适应自旋JDK 1.64. 重量级锁高竞争、长持有最终锁升级路径标准总结JDK 15 以前经典路径JDK 15现代 JVM已废弃偏向锁锁升级核心思想偏向锁、轻量级锁、重量级锁各自原理和适用场景1. 偏向锁Biased Lock原理特点适用场景2. 轻量级锁Lightweight Lock原理特点适用场景3. 重量级锁Heavyweight Lock原理特点适用场景总结偏向锁轻量级锁重量级锁synchronized 底层原理synchronized是Java提供的原子性内置锁这种内置的并且使用者看不到的锁也被称为监视器锁一个同步块里只有一个锁对象然后里面的线程都想要使用这个对象想要使用的都执行monitorenter命令都在enterList里面争抢锁成功的就计数器加1失败的就继续在enterList里面等待等锁释放了就monitorexist计数器-1当线程执行wait方法释放锁后会进入waitList队列synchronized 锁升级流程无锁→偏向锁→轻量级锁→重量级锁这个机制的核心在于对象头中的Mark Word它会根据锁状态存储不同的信息通过其中的锁标志位来标识当前锁处于什么状态。无锁当一个对象刚创建出来的时候没有线程访问他并且mark word里面存储的是他的hashcode、分代年龄等信息锁标志位是0、1偏向锁位是0如果使用了hashcode方法就不能升级到偏向锁因为偏向锁需要用Mark word的空间来存储当前线程IDhashcode也要占用这一部分冲突了偏向锁2. 偏向锁单线程无竞争当第一个线程进入同步块时锁升级为偏向锁。通过CAS 操作将线程 ID 记录到对象头Mark Word中。锁标志位保持01偏向标志位改为1。该线程再次进入同步块时只需判断Mark Word中的线程 ID 是否是自己无需加锁 / 解锁效率极高。偏向锁撤销当第二个线程尝试竞争锁时偏向锁立即撤销。撤销需要到达安全点暂停原线程判断是否仍在同步块中然后清除偏向标记。偏向锁撤销开销较大竞争一旦出现就会升级到轻量级锁。JDK 15 默认禁用偏向锁JDK 18 彻底废弃现代 JVM 锁升级路径无锁 → 轻量级锁 → 重量级锁3. 轻量级锁自旋锁短时间、轻度竞争偏向锁撤销后进入轻量级锁阶段线程在自己栈帧中创建锁记录Lock Record。将对象头的Mark Word复制到锁记录中。使用CAS 操作尝试将对象头的Mark Word替换为指向锁记录的指针。如果 CAS 成功当前线程获取轻量级锁锁标志位变为00。轻量级锁竞争如果 CAS 失败说明有其他线程竞争。当前线程开始自旋循环重试 CAS 尝试获取锁。自旋是用 CPU 时间换避免线程阻塞的开销适合锁执行时间很短的场景。自适应自旋JDK 1.6JVM 会根据历史自旋成功率动态调整自旋次数。上次成功 → 自旋更久上次失败 → 快速放弃。4. 重量级锁高竞争、长持有当自旋达到阈值仍未获取锁或出现多线程同时竞争时轻量级锁膨胀为重量级锁。锁标志位变为10。Mark Word指向Monitor监视器锁对象。未获取锁的线程进入EntryList阻塞排队。依赖操作系统Mutex 互斥量实现。线程阻塞 / 唤醒需要用户态 ↔ 内核态切换开销最大。优点竞争激烈、锁持有时间长时比自旋更节省 CPU。最终锁升级路径标准总结JDK 15 以前经典路径无锁 → 偏向锁 → 轻量级锁 → 重量级锁JDK 15现代 JVM已废弃偏向锁无锁 → 轻量级锁 → 重量级锁升级核心思想根据线程竞争程度自动选择成本最低的锁机制无竞争用偏向锁轻度竞争用轻量级锁高竞争用重量级锁。 用复杂度换性能让 synchronized 在各种场景都高效。偏向锁、轻量级锁、重量级锁各自原理和适用场景1. 偏向锁Biased Lock原理锁一开始偏向第一个获取它的线程。在对象头Mark Word里记录线程 ID。下次这个线程再进来不需要 CAS、不需要抢锁直接判断 ID 是不是自己是就直接进同步块。锁标志位01偏向位 1一旦出现第二个线程竞争偏向锁立刻撤销升级为轻量级锁。特点无锁开销、最快只服务一个线程撤销偏向锁的成本很高适用场景只有一个线程反复进入同步块完全无竞争。2. 轻量级锁Lightweight Lock原理线程在自己栈帧中创建锁记录Lock Record。用CAS尝试把对象头的Mark Word替换成指向锁记录的指针。CAS 成功 加锁成功CAS 失败 线程开始自旋循环重试锁标志位00特点不阻塞、不进入内核态自旋消耗 CPU但避免线程切换开销竞争变激烈就膨胀为重量级锁适用场景多个线程交替访问同步块轻度竞争锁执行时间非常短。3. 重量级锁Heavyweight Lock原理依赖操作系统 Mutex 互斥锁对象头Mark Word指向Monitor抢不到锁的线程进入EntryList阻塞阻塞 / 唤醒需要用户态 ↔ 内核态切换锁标志位10特点线程会阻塞不消耗 CPU切换成本最高、最慢最稳定、最安全适用场景竞争激烈锁执行时间长多线程同时争抢。总结偏向锁原理锁偏向第一个线程记录线程 ID无竞争无需加锁。场景单线程重复访问无竞争。轻量级锁原理使用 CAS 自旋尝试获取锁不阻塞。场景线程交替访问锁执行时间短。重量级锁原理依赖操作系统互斥量线程阻塞排队。场景高竞争、锁执行时间长。
【JUC第二章上】:锁机制关键字
发布时间:2026/5/27 5:05:05
你好我是fengxin_rou这是我的个人主页fengxin_rou的主页❄️欢迎查看我的专栏我的专栏《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》目录synchronized 底层原理synchronized 锁升级流程无锁偏向锁2. 偏向锁单线程无竞争偏向锁撤销3. 轻量级锁自旋锁短时间、轻度竞争轻量级锁竞争自适应自旋JDK 1.64. 重量级锁高竞争、长持有最终锁升级路径标准总结JDK 15 以前经典路径JDK 15现代 JVM已废弃偏向锁锁升级核心思想偏向锁、轻量级锁、重量级锁各自原理和适用场景1. 偏向锁Biased Lock原理特点适用场景2. 轻量级锁Lightweight Lock原理特点适用场景3. 重量级锁Heavyweight Lock原理特点适用场景总结偏向锁轻量级锁重量级锁synchronized 底层原理synchronized是Java提供的原子性内置锁这种内置的并且使用者看不到的锁也被称为监视器锁一个同步块里只有一个锁对象然后里面的线程都想要使用这个对象想要使用的都执行monitorenter命令都在enterList里面争抢锁成功的就计数器加1失败的就继续在enterList里面等待等锁释放了就monitorexist计数器-1当线程执行wait方法释放锁后会进入waitList队列synchronized 锁升级流程无锁→偏向锁→轻量级锁→重量级锁这个机制的核心在于对象头中的Mark Word它会根据锁状态存储不同的信息通过其中的锁标志位来标识当前锁处于什么状态。无锁当一个对象刚创建出来的时候没有线程访问他并且mark word里面存储的是他的hashcode、分代年龄等信息锁标志位是0、1偏向锁位是0如果使用了hashcode方法就不能升级到偏向锁因为偏向锁需要用Mark word的空间来存储当前线程IDhashcode也要占用这一部分冲突了偏向锁2. 偏向锁单线程无竞争当第一个线程进入同步块时锁升级为偏向锁。通过CAS 操作将线程 ID 记录到对象头Mark Word中。锁标志位保持01偏向标志位改为1。该线程再次进入同步块时只需判断Mark Word中的线程 ID 是否是自己无需加锁 / 解锁效率极高。偏向锁撤销当第二个线程尝试竞争锁时偏向锁立即撤销。撤销需要到达安全点暂停原线程判断是否仍在同步块中然后清除偏向标记。偏向锁撤销开销较大竞争一旦出现就会升级到轻量级锁。JDK 15 默认禁用偏向锁JDK 18 彻底废弃现代 JVM 锁升级路径无锁 → 轻量级锁 → 重量级锁3. 轻量级锁自旋锁短时间、轻度竞争偏向锁撤销后进入轻量级锁阶段线程在自己栈帧中创建锁记录Lock Record。将对象头的Mark Word复制到锁记录中。使用CAS 操作尝试将对象头的Mark Word替换为指向锁记录的指针。如果 CAS 成功当前线程获取轻量级锁锁标志位变为00。轻量级锁竞争如果 CAS 失败说明有其他线程竞争。当前线程开始自旋循环重试 CAS 尝试获取锁。自旋是用 CPU 时间换避免线程阻塞的开销适合锁执行时间很短的场景。自适应自旋JDK 1.6JVM 会根据历史自旋成功率动态调整自旋次数。上次成功 → 自旋更久上次失败 → 快速放弃。4. 重量级锁高竞争、长持有当自旋达到阈值仍未获取锁或出现多线程同时竞争时轻量级锁膨胀为重量级锁。锁标志位变为10。Mark Word指向Monitor监视器锁对象。未获取锁的线程进入EntryList阻塞排队。依赖操作系统Mutex 互斥量实现。线程阻塞 / 唤醒需要用户态 ↔ 内核态切换开销最大。优点竞争激烈、锁持有时间长时比自旋更节省 CPU。最终锁升级路径标准总结JDK 15 以前经典路径无锁 → 偏向锁 → 轻量级锁 → 重量级锁JDK 15现代 JVM已废弃偏向锁无锁 → 轻量级锁 → 重量级锁升级核心思想根据线程竞争程度自动选择成本最低的锁机制无竞争用偏向锁轻度竞争用轻量级锁高竞争用重量级锁。 用复杂度换性能让 synchronized 在各种场景都高效。偏向锁、轻量级锁、重量级锁各自原理和适用场景1. 偏向锁Biased Lock原理锁一开始偏向第一个获取它的线程。在对象头Mark Word里记录线程 ID。下次这个线程再进来不需要 CAS、不需要抢锁直接判断 ID 是不是自己是就直接进同步块。锁标志位01偏向位 1一旦出现第二个线程竞争偏向锁立刻撤销升级为轻量级锁。特点无锁开销、最快只服务一个线程撤销偏向锁的成本很高适用场景只有一个线程反复进入同步块完全无竞争。2. 轻量级锁Lightweight Lock原理线程在自己栈帧中创建锁记录Lock Record。用CAS尝试把对象头的Mark Word替换成指向锁记录的指针。CAS 成功 加锁成功CAS 失败 线程开始自旋循环重试锁标志位00特点不阻塞、不进入内核态自旋消耗 CPU但避免线程切换开销竞争变激烈就膨胀为重量级锁适用场景多个线程交替访问同步块轻度竞争锁执行时间非常短。3. 重量级锁Heavyweight Lock原理依赖操作系统 Mutex 互斥锁对象头Mark Word指向Monitor抢不到锁的线程进入EntryList阻塞阻塞 / 唤醒需要用户态 ↔ 内核态切换锁标志位10特点线程会阻塞不消耗 CPU切换成本最高、最慢最稳定、最安全适用场景竞争激烈锁执行时间长多线程同时争抢。总结偏向锁原理锁偏向第一个线程记录线程 ID无竞争无需加锁。场景单线程重复访问无竞争。轻量级锁原理使用 CAS 自旋尝试获取锁不阻塞。场景线程交替访问锁执行时间短。重量级锁原理依赖操作系统互斥量线程阻塞排队。场景高竞争、锁执行时间长。