高并发问题与排查 一、常见高并发底层问题1. 锁竞争 & 上下文切换(1)锁竞争 现象:大量线程争抢同一把锁,大量 BLOCKED 线程,请求排队、接口 rt 飙升、吞吐量下降。 原因: synchronized / ReentrantLock 锁粒度过大 共享变量无脑加锁,串行化严重 全局唯一大锁,并发退化串行 后果:锁等待耗时、服务吞吐上不去、高峰期雪崩。 (2)上下文切换CPU 线程来 2026-04-16 java并发 #java并发
CompletableFuture异步编程 一、核心定位CompletableFuture = JDK8 全新异步非阻塞编程工具 替代 Future + 线程池 老旧写法 支持链式回调、任务串行 / 并行组合、异常自动传递 不用手动写回调嵌套,解决回调地狱 默认用 ForkJoinPool 公共线程池,也可自定义指定线程池 二、异步任务创建与执行1. 常用创建方法12345// 无返回值 异步执行Completab 2026-04-16 java并发 #java并发
并发集合 一、ConcurrentHashMap 1.7 vs 1.81. JDK 1.7 :分段锁(Segment) 结构:Segment 数组 + HashEntry 数组 + 链表 锁设计: 把 Map 分成 16 个 Segment 每个 Segment 是一把独立的 ReentrantLock 不同 Segment 可以并发读写 核心:分段加锁,减小锁粒度,提高并发度 缺点: 结构复杂 链表查 2026-04-16 java并发 #java并发
线程池ThreadPoolExecutor 一、七大核心参数123456789public ThreadPoolExecutor( int corePoolSize, // 核心线程数 int maximumPoolSize, // 最大线程数 long keepAliveTime, // 空闲线程存活时间 TimeUnit unit, // 时间单 2026-04-16 java并发 #java并发
阻塞队列BlockingQueue 一、BlockingQueue 是什么?自带阻塞功能的线程安全队列 队空:取数据的线程会阻塞等待 队满:放数据的线程会阻塞等待 天然实现生产者 - 消费者模型,完全不用写 wait/notify 核心方法(必须记住): put(e):队满则阻塞 take():队空则阻塞 offer(e) / poll():不阻塞,返回布尔 /null 二、四大常用阻塞队列( 2026-04-16 java并发 #java并发
ThreadLocal 一、ThreadLocal 核心作用线程本地变量: 每个线程独有一份变量副本,线程之间完全隔离、互不干扰; 用来避免多线程共享变量竞争,代替加锁,提升并发效率。 二、实现原理1. 核心归属关系每个 Thread 对象 内部,自带一个: 1ThreadLocal.ThreadLocalMap threadLocals; 不是 ThreadLocal 存数据 数据存在当前线程自己的 Thread 2026-04-16 java并发 #java并发
AQS同步工具类 1. CountDownLatch 计数器作用让一个线程等待其他 N 个线程全部执行完,再继续运行。 一次性门栓,用完就废,不能重置。 核心原理 基于 AQS 共享模式 初始化传入 count 每次 countDown() → count -1 await() 会阻塞,直到 count = 0 典型场景 主线程等待多个子线程初始化完成 分布式接口:等待多个下游调用全部返回 代码示例1 2026-04-16 java并发 #java并发
并发安全问题(死锁) 一、死锁1. 死锁定义多个线程互相持有对方需要的锁,又都不释放自己的锁, 互相无限等待,程序彻底卡死、无法继续执行。 2. 死锁四个必要条件(缺一不可) 互斥条件 资源是独占的,同一时刻只能被一个线程持有。 请求与保持 线程已经持有一把锁,不释放旧锁,又去申请新锁。 不可剥夺 锁只能自己主动释放,不能被其他线程强行抢走。 循环等待 线程之间形成环路锁依赖:T1 等 T2 的锁,T2 等 T1 2026-04-16 java并发 #java并发
java线程通信 一、wait /notify/notifyAll 底层原理1. 核心前提 必须在synchronized 锁内部使用,否则直接抛 IllegalMonitorStateException 调用 wait() 会自动释放当前锁,进入对象的 WaitSet 等待池 被唤醒后不会立刻执行,需要重新竞争锁,抢到锁才会继续往下走 2. 方法作用 obj.wait() 当前线程进入无限等 2026-04-16 java并发 #java并发
读写锁StampedLock Java 读写锁ReentrantReadWriteLock 读写锁核心特性 读写分离:分为读锁(共享锁)和写锁(独占锁) 互斥规则 读 + 读:不互斥,多个线程可以同时加读锁 读 + 写:互斥,读锁持有时写锁阻塞,写锁持有时读锁阻塞 写 + 写:互斥,完全独占 可重入:同一个线程可以重复获取锁 支持锁降级:写锁可以降级为读锁(先获取写锁 → 获取读锁 → 释放写锁) 致命缺点读多写少时,会 2026-04-16 java并发 #java并发