讲师中心 微信公众号
AI工具推荐 视频效率加速

深入理解Java中的Lock体系_与Synchronized锁在内核态与用户态的差异

夜伟同学_1495

夜伟同学_1495

发布时间:2026-02-16 08:24:42

|

826人浏览过

|

来源于php中文网

原创

Lock和synchronized加锁操作本身都不进内核态,仅在竞争激烈导致线程挂起时(如LockSupport.park()或重量级锁等待),才由JVM触发系统调用进入内核态。

深入理解java中的lock体系_与synchronized锁在内核态与用户态的差异

Java中Lock和synchronized到底谁进内核态?

都不进。这是最常见的误解——synchronized 和 ReentrantLock 在绝大多数情况下全程运行在用户态,JVM 通过 CAS、自旋、队列等纯软件机制实现锁逻辑,不触发系统调用,更不进入内核态。

只有当线程竞争激烈、自旋失败后被挂起时,JVM 才会调用 pthread_cond_wait(Linux)或类似系统原语,此时线程才真正陷入内核态等待。但这属于“锁等待”的代价,不是“加锁操作”本身进内核。

  • synchronized 的 monitor enter/exit 默认走快速路径:CAS 修改对象头中的 mark word,无竞争时几乎零开销
  • ReentrantLock.lock() 底层也是基于 Unsafe.compareAndSwapInt 操作 AQS 的 state 字段
  • 真正进内核的节点是:AQS 中 LockSupport.park() 被调用时(线程阻塞),而非 lock() 调用那一刻

为什么synchronized没有显式unlock却不会内存泄漏?

因为 synchronized 是 JVM 层语法糖,编译后由 monitorenter / monitorexit 字节码指令保证配对执行,哪怕发生异常,JVM 也会在对应异常表中插入 monitorexit 指令。

而 ReentrantLock 是普通 Java 类,lock() 和 unlock() 完全对称,必须手动配对,漏写 unlock() 就真会死锁或资源泄露。

立即学习“Java免费学习笔记(深入)”;

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
  • 反编译含 synchronized 的方法,能看到 finally 块里重复出现 monitorexit
  • ReentrantLock 的 unlock() 必须放在 finally 中,否则 try 块抛异常就跳过了
  • JVM 不负责回收 ReentrantLock 占用的 AQS Node,但会自动清理 synchronized 关联的 monitor(对象头复位 + monitor 复用)

LockSupport.park() 和 synchronized 等待的本质区别

表面都是“线程暂停”,但背后调度粒度和语义完全不同:LockSupport.park() 是线程级阻塞,由 JVM 直接委托给 OS;而 synchronized 的等待,在轻量级锁膨胀为重量级锁前,压根不 park,只自旋。

换句话说:synchronized 的“等”可能是空转 CPU,Lock 的“等”大概率是交出 CPU 时间片。

  • 自旋阈值默认是 10 次(可通过 -XX:PreBlockSpin 调整),超过才调用 park()
  • ReentrantLock 默认不自旋(除非用 new ReentrantLock(true) 开启公平模式下的有限重试)
  • 频繁 park/unpark 会触发线程状态切换开销,比单纯 CAS 自旋更重——这也是为何高并发短临界区场景下 synchronized 反而更快

排查“锁没释放”问题时,别只盯着 unlock() 调用

常见误判是:看到 unlock() 写了,就认为没问题。实际上,如果 lock() 和 unlock() 不在同一个线程执行(比如跨线程传递锁对象)、或 unlock() 被异常吞掉(没写 finally)、或锁对象被多次 lock() 却只 unlock() 一次,都会导致持有数不归零。

而 synchronized 天然规避了前两种情况,只可能因嵌套过深+异常打断导致 monitor 未完全退出(极罕见,且 JVM 有兜底)。

  • 用 jstack 查 java.lang.Thread.State: BLOCKED on java.lang.Object@... 表示还在等 monitor;WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@... 才是 Lock 的条件等待
  • jcmd <pid> VM.native_memory summary</pid> 看不到锁内存占用,但 jstack 能暴露谁卡在哪个锁上
  • AQS 的 state 值非 0 且线程不活跃,基本可断定是 unlock() 缺失或错配
事情说清了就结束。内核态切换不是锁的属性,而是线程调度的结果;真正该盯紧的,永远是“谁在什么时候持有了什么,又有没有还”。

热门AI工具

更多
小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4698

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

583

2025.12.01

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4450

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3733

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

3033

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

7490

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

7122

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

4053

2023.07.20

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn