《Java 100 天进阶之路》并发编程与JUC详解(第51~60篇)核心知识点汇总 📅 发布时间:2026/7/14 23:22:46 👁️ 浏览次数: 并发编程与JUC详解第51~60篇核心知识点汇总本阶段共10篇文章覆盖Java并发编程从基础到精通的完整链路是面试权重最高、区分度最大的模块之一。第51篇线程生命周期与创建方式 查看完整文章6种线程状态Thread.StateNEW线程创建但未启动new Thread()RUNNABLE可运行状态就绪 运行中JVM将两者合并BLOCKED阻塞状态等待获取监视器锁synchronized锁被占用WAITING无限期等待需显式唤醒wait()、join()、park()TIMED_WAITING有限期等待超时自动唤醒sleep(ms)、wait(ms)、join(ms)TERMINATED终止状态run()结束或异常退出4种线程创建方式继承Thread类不推荐单继承限制实现Runnable接口最常用Lambda写法实现Callable接口有返回值可抛异常线程池ExecutorService核心对比sleep() vs wait()sleep不释放锁wait释放锁sleep时间到自醒wait需notify唤醒start() vs run()start启动新线程run是普通方法调用虚拟线程JDK 21轻量级线程几百字节M:N调度适合高并发I/O密集型不适合CPU密集型第52篇synchronized深度解析 查看完整文章三种使用方式修饰实例方法 → 锁当前实例this修饰静态方法 → 锁当前类的Class对象修饰代码块 → 锁括号内指定对象推荐粒度最细锁升级全流程JDK 1.6无锁→偏向锁→轻量级锁→重量级锁单向升级不可逆偏向锁单线程场景Mark Word存线程ID无CAS开销轻量级锁轻度竞争自旋等待CASLock Record在栈帧重量级锁重度竞争OS互斥量ObjectMonitor_owner、_count、_EntryList、_WaitSetMark Word64位JVM存储锁状态、hashCode、分代年龄、偏向线程ID锁标志位01无锁/偏向、00轻量级、10重量级、11GC标记JVM优化自适应自旋锁JVM动态调整自旋次数锁消除逃逸分析移除无竞争锁锁粗化合并连续加锁/解锁关键陷阱JDK 15默认禁用偏向锁-XX:UseBiasedLocking可重新启用虚拟线程中慎用synchronized → 导致Pinning固定在载体线程第53篇volatile与JMM 查看完整文章JMMJava内存模型核心抽象结构主内存共享变量 工作内存CPU缓存JMM ≠ JVM内存结构——JMM管“怎么看见”JVM内存结构管“存哪里”三大特性原子性synchronized/锁、可见性volatile、有序性内存屏障volatile特性✅ 保证可见性写即刷主存读即强制重载✅ 禁止指令重排序内存屏障❌ 不保证原子性i是读-改-写三步内存屏障四种类型StoreStore禁止普通写重排到volatile写之前StoreLoad禁止volatile写重排到后续读写之后开销最大LoadLoad禁止volatile读后续普通读重排到前面LoadStore禁止volatile读后续普通写重排到前面Happens-Before规则volatile写 → volatile读核心规则程序顺序规则、锁规则、传递性DCL单例必须加volatile防止new Singleton()三步分配内存→初始化→引用赋值重排导致半初始化对象暴露 → NPE第54篇AQS抽象队列同步器 查看完整文章AQS核心三要素volatile int state同步状态0空闲0占用/重入/许可数CLH双向FIFO队列存储等待线程Node节点含thread、waitStatus、prev、next模板方法模式子类实现tryAcquire/tryRelease等AQS提供acquire/release骨架两种同步模式独占模式Exclusive同一时刻只有一个线程能获取 → ReentrantLock共享模式Shared同一时刻多个线程可获取 → Semaphore、CountDownLatchNode.waitStatusCANCELLED(1)、SIGNAL(-1)、CONDITION(-2)、PROPAGATE(-3)、0(初始)ReentrantLock可重入实现state计数当前线程是持有者时state解锁时state--归零释放第55篇线程池ThreadPoolExecutor 查看完整文章七大核心参数参数说明corePoolSize核心线程数常驻员工maximumPoolSize最大线程数核心非核心keepAliveTime非核心线程空闲存活时间unit时间单位workQueue工作队列BlockingQueuethreadFactory线程工厂自定义线程名handler拒绝策略四步执行流程当前线程数 corePoolSize → 创建核心线程执行核心线程满 → 任务放入队列等待队列满 → 当前线程数 maximumPoolSize → 创建非核心线程线程也满 → 执行拒绝策略四种拒绝策略AbortPolicy默认抛RejectedExecutionExceptionCallerRunsPolicy调用者线程执行可防止任务丢失会阻塞调用者DiscardPolicy静默丢弃新任务DiscardOldestPolicy丢弃队列最旧任务重新提交Executors陷阱禁止使用newFixedThreadPool无界LinkedBlockingQueue → 任务堆积 → OOMnewCachedThreadPoolmaxPoolSizeInteger.MAX_VALUE → 无限线程 → 资源耗尽线程数计算公式CPU密集型 CPU核数 1IO密集型 CPU核数 × 2第56篇死锁与排查工具 查看完整文章死锁四大必要条件Coffman条件互斥资源一次只能被一个线程占用持有并等待持有资源的同时等待其他资源不可剥夺资源只能主动释放不能强行剥夺循环等待线程之间形成等待环路排查工具jstack -l PID命令行首选输出Found one Java-level deadlock定位waiting to lock和locked行号jconsole图形化一键检测死锁VisualVM深度分析线程状态监控死锁 vs 活锁 vs 饥饿死锁永久阻塞不主动干预永不恢复活锁不阻塞但不断重试失败空转无推进饥饿有进展但极其缓慢低优先级线程预防策略破坏四大条件之一统一锁顺序破坏循环等待ReentrantLock.tryLock(timeout)超时破坏不可剥夺一次性申请所有资源失败则全部释放破坏持有并等待减少锁粒度使用ConcurrentHashMap等第57篇CompletableFuture异步编程 查看完整文章Future四大痛点阻塞获取结果get()异步变同步无法链式调用无法组合多个任务异常处理困难核心API方法说明supplyAsync(Supplier)有返回值的异步任务runAsync(Runnable)无返回值的异步任务thenApply(Function)同步转换结果同一线程thenApplyAsync(Function)异步转换结果新线程thenCompose(Function)串联异步任务扁平化thenCombine并行合并两个任务结果allOf等待所有任务完成VoidanyOf等待任意一个任务完成异常处理三件套exceptionally(Function)仅异常时触发返回兜底值handle(BiFunction)成功/失败都触发可继续链式处理whenComplete(BiConsumer)收尾工作不改变结果异常继续传播线程池配置禁止使用ForkJoinPool.commonPool()业务异步必须自建线程池CPU密集型接近CPU核心数IO密集型CPU核心数×2第58篇原子类与CAS 查看完整文章CAS三要素内存位置 V、预期值 A、新值 BCPU原子指令x86lock cmpxchg硬件保证原子性CAS失败 → 自旋重试for(;;)循环原子类五大分类基本类型AtomicInteger、AtomicLong、AtomicBoolean数组类型AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray引用类型AtomicReference、AtomicStampedReference解决ABA、AtomicMarkableReference属性更新器AtomicIntegerFieldUpdater等零内存开销字段必须volatile高性能累加器LongAdder、DoubleAdder、LongAccumulatorABA问题值 A→B→ACAS误判为未被修改 →AtomicStampedReference版本号解决LongAdder设计低并发直接CAS更新base高并发分段累加Cell[]各自累加最后求和Contended防止伪共享每个Cell独占缓存行性能是AtomicLong的4倍以上VarHandle替代UnsafeJDK 23重要变更Unsafe内存访问方法已废弃JEP 471推荐方案MethodHandles.lookup().findVarHandle()优势直接映射JVM字节码类型校验精细内存顺序控制第59篇ThreadLocal原理与内存泄漏 查看完整文章核心设计空间换时间每个线程独立变量副本实现线程间数据隔离JDK 1.8架构控制权反转ThreadLocal 不再维护全局Map每个Thread对象持有自己的ThreadLocalMapThreadLocal实例作为Map的keyEntry结构关键设计keyThreadLocal实例WeakReference弱引用value变量副本强引用内存泄漏完整链路ThreadLocal外部引用被置空 → GC回收ThreadLocal对象 → Entry.key变为null弱引用特性→ Entry.value仍是强引用无法回收 → 线程存活 → ThreadLocalMap存活 → null-key Entry永久残留 → 内存泄漏关键结论弱引用只解决了ThreadLocal对象的回收缓解泄漏不能解决value的回收根治方案try-finally保证remove()执行跨线程传递方案InheritableThreadLocal父子线程传递仅新建子线程时复制TransmittableThreadLocal阿里开源线程池场景上下文传递remove() vs set(null)remove()删除整个Entrykeyvalue彻底释放内存set(null)只设value为nullEntry仍存在内存泄漏未解决第60篇并发编程面试压轴题 查看完整文章本阶段共10篇内容对应第51~59篇的全部考点覆盖8大模块、30高频题。核心模块速览模块核心考点面试权重基础概念线程6种状态、sleep/wait、4种创建方式⭐⭐⭐⭐锁机制synchronized锁升级、Mark Word、ReentrantLock⭐⭐⭐⭐⭐JMM与volatile可见性、有序性、内存屏障、happens-before⭐⭐⭐⭐⭐AQS与并发工具核心三要素、独占/共享模式、Semaphore⭐⭐⭐⭐⭐线程池七大参数、执行流程、拒绝策略、Executors陷阱⭐⭐⭐⭐⭐死锁排查四大必要条件、jstack实战⭐⭐⭐⭐异步与无锁CompletableFuture编排、CAS三要素、ABA⭐⭐⭐⭐ThreadLocal内存泄漏根因、弱引用/强引用、remove⭐⭐⭐⭐
C++宏定义:从基础语法到高级应用与最佳实践 1. 项目概述:为什么宏定义是C程序员绕不开的坎?如果你写过C,尤其是接触过一些大型项目或者开源库的源码,比如STL、Boost或者一些游戏引擎的底层代码,那你一定对宏定义不陌生。那些以#define开头的、看起来像魔法一样的… 2026/7/14 23:22:46
遗传算法实战进阶:动态算子、自适应参数与工业级调试 1. 项目概述:为什么遗传算法的“第二课”比第一课更关键你翻过不少资料,也看过“遗传算法入门”的标题党文章——讲完生物类比、种群、染色体、适应度,就戛然而止,留下一堆没落地的公式和一句“交叉变异后迭代即可”。但真正动手写… 2026/7/14 23:20:45
【需求工程】统一建模语言UML类图中关联、多样性和角色 UML类图:关联、多样性、角色 完整解读 这是UML类图的基础知识点,分为图示样例 文字定义两部分,我拆开逐点讲清楚。 一、先看懂上面的建模样例(人 ↔ 车辆) 1. 两个「类」 人:属性 姓名、出生日期车辆&… 2026/7/14 23:16:44
终极FGA自动战斗配置指南:从新手到专家的完整实战方案 终极FGA自动战斗配置指南:从新手到专家的完整实战方案 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA Fate/Grand Automata(简称FGA)是一款专为FGO安卓玩家设计的智能自动战… 2026/7/15 1:09:21
csp信奥赛C++高频考点专项训练:【二分答案】案例5:进击的奶牛 csp信奥赛C高频考点专项训练:【二分答案】案例5:进击的奶牛 题目描述 Farmer John 建造了一个有 NNN(2≤N≤1052 \leq N \leq 10 ^ 52≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x1,x2,⋯,xNx _ 1, x … 2026/7/15 1:09:21
HarmonyOS RDB 模糊搜索变慢怎么办:中式美食菜名、别名和食材关键词怎么分层查询 本地菜谱越来越多以后,搜索响应慢,结果排序还经常把弱相关菜排前面。 中式美食里同一个菜谱会从搜索、分类、收藏、推荐和购物清单多个入口出现,状态一旦没拆清楚,用户看到的就是点了没反应、返回位置丢了、统计不准或者卡片状态串… 2026/7/15 1:07:20
套用 NIST 框架做风控,五步搞定企业安全体系 从混乱到有序:用 NIST 框架重构企业风控体系面对日益复杂的网络威胁,许多企业的安全团队往往陷入“救火式”运维的泥潭:今天修补一个漏洞,明天响应一次钓鱼邮件,缺乏系统性的防御逻辑。这种碎片化的应对方式不仅效率低… 2026/7/15 1:05:20
工艺窗口太窄良率不稳:我用DOE方法找到了最优参数组合 新工艺导入时窗口太窄,温度偏差2度就超规,良率从92%波动到75%。PE调了一周没找到稳定点,我建议用实验设计(DOE)方法系统化寻找最优参数组合。做了一套4因素3水平正交实验,27组实验后找到了温度、压力、流量… 2026/7/15 1:03:19
【实战指南】MATLAB蒙特卡罗模拟:从金融定价到系统优化 1. 蒙特卡罗模拟:金融与工程优化的万能钥匙第一次接触蒙特卡罗模拟是在研究生时期,当时导师让我用这个方法估算一个复杂金融衍生品的价格。看着那些随机生成的数字最终收敛到一个合理结果时,我彻底被这种"暴力计算"的美学征服了。蒙… 2026/7/15 1:03:19
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41