第一部分:Java并发工具类生产实战代码模板
一、CountDownLatch 多任务并行汇总
业务场景
批量调用第三方接口、多线程分片查询数据、启动初始化多组件
java
import java.util.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchDemo {
private static final ExecutorService POOL = Executors.newFixedThreadPool(10);
public static void main(String[] args) throws InterruptedException {
int taskNum = 5;
CountDownLatch latch = new CountDownLatch(taskNum);
for (int i = 0; i < taskNum; i++) {
int idx = i;
POOL.execute(() -> {
try {
System.out.println("执行任务" + idx);
// 模拟业务耗时
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 必须放finally,防止异常不计数
latch.countDown();
}
});
}
// 主线程阻塞等待全部完成
latch.await();
System.out.println("所有子任务执行完毕,开始汇总结果");
POOL.shutdown();
}
}
核心规范
countDown()强制写finally- 不可重复使用,用完新建
- 可重载
await(long timeout, TimeUnit unit)设置超时防死等
二、CyclicBarrier 线程凑齐同步执行
业务场景
批量数据同步、并发压测、多节点协同执行
java
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierDemo {
private static final ExecutorService POOL = Executors.newFixedThreadPool(8);
public static void main(String[] args) {
// 凑齐6个线程再一起执行,凑齐后执行回调
CyclicBarrier barrier = new CyclicBarrier(6, () ->
System.out.println("全员就位,统一开始执行任务"));
for (int i = 0; i < 6; i++) {
int idx = i;
POOL.execute(() -> {
try {
System.out.println("线程" + idx + "到达等待点");
// 等待其他线程
barrier.await();
System.out.println("线程" + idx + "正式执行业务");
} catch (InterruptedException | BrokenBarrierException e) {
Thread.currentThread().interrupt();
}
});
}
POOL.shutdown();
}
}
特点:可循环复用;线程中断会破坏屏障
三、Semaphore 接口限流 / 资源并发控制
业务场景
第三方接口限流、数据库连接管控、单机并发数限制
java
import java.util.concurrent.Semaphore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SemaphoreLimitDemo {
// 最大允许并发10个
private static final Semaphore SEMAPHORE = new Semaphore(10);
private static final ExecutorService POOL = Executors.newCachedThreadPool();
public static void main(String[] args) {
for (int i = 0; i < 30; i++) {
int idx = i;
POOL.execute(() -> {
try {
// 获取许可
SEMAPHORE.acquire();
System.out.println("任务" + idx + "获取许可,执行业务");
Thread.sleep(800);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
// 释放许可,必写finally
SEMAPHORE.release();
}
});
}
POOL.shutdown();
}
}
扩展 :tryAcquire()非阻塞获取,抢不到直接降级
四、ReentrantLock 可重入显式锁标准模板
业务场景
需要超时抢锁、可中断、公平锁、多条件等待
java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.TimeUnit;
public class ReentrantLockBizDemo {
// 非公平锁(默认)
private static final Lock LOCK = new ReentrantLock();
// 公平锁写法:new ReentrantLock(true)
public void bizMethod() {
// 1. 基础加锁写法
LOCK.lock();
try {
// 临界区业务代码
System.out.println("执行互斥业务逻辑");
} finally {
// 强制finally解锁,防止死锁
LOCK.unlock();
}
}
// 2. 超时抢锁(生产常用防死锁)
public boolean tryLockBiz() {
boolean tryGet = false;
try {
// 3秒内抢不到直接放弃
tryGet = LOCK.tryLock(3, TimeUnit.SECONDS);
if (tryGet) {
// 执行业务
System.out.println("抢锁成功");
} else {
System.out.println("抢锁超时,执行降级逻辑");
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
if (tryGet) {
LOCK.unlock();
}
}
return tryGet;
}
}
五、ReentrantReadWriteLock 读写锁模板
业务场景
本地缓存、配置数据、读多写少业务
java
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockCacheDemo {
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
private String cacheData;
// 读操作:共享锁,多线程并发读
public String getCache() {
rwLock.readLock().lock();
try {
return cacheData;
} finally {
rwLock.readLock().unlock();
}
}
// 写操作:排他锁,互斥执行
public void setCache(String data) {
rwLock.writeLock().lock();
try {
this.cacheData = data;
} finally {
rwLock.writeLock().unlock();
}
}
}
架构要点:支持锁降级,严禁锁升级
六、Condition 精准分组等待唤醒
业务场景
生产者消费者、队列满 / 空精准阻塞
java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionQueueDemo {
private final Lock lock = new ReentrantLock();
// 队列非空条件
private final Condition notEmpty = lock.newCondition();
// 队列非满条件
private final Condition notFull = lock.newCondition();
private int count = 0;
private static final int MAX_SIZE = 10;
// 生产
public void produce() throws InterruptedException {
lock.lock();
try {
while (count >= MAX_SIZE) {
notFull.await(); // 队列满等待
}
count++;
System.out.println("生产完成,数量:" + count);
notEmpty.signal(); // 唤醒消费
} finally {
lock.unlock();
}
}
// 消费
public void consume() throws InterruptedException {
lock.lock();
try {
while (count <= 0) {
notEmpty.await(); // 队列为空等待
}
count--;
System.out.println("消费完成,数量:" + count);
notFull.signal(); // 唤醒生产
} finally {
lock.unlock();
}
}
}
七、ThreadLocal 上下文透传标准模板
业务场景
登录用户信息、链路追踪 ID、数据源上下文
java
public class UserContextHolder {
// 全局线程本地存储
private static final ThreadLocal<LoginUser> USER_HOLDER = new ThreadLocal<>();
// 设置用户
public static void setUser(LoginUser user) {
USER_HOLDER.set(user);
}
// 获取用户
public static LoginUser getUser() {
return USER_HOLDER.get();
}
// 强制清空,杜绝内存泄漏
public static void clear() {
USER_HOLDER.remove();
}
}
// 使用规范
class BizService {
public void execute() {
try {
UserContextHolder.setUser(new LoginUser());
// 业务全链路获取上下文
LoginUser user = UserContextHolder.getUser();
} finally {
// 必清!线程池环境强制清理
UserContextHolder.clear();
}
}
}
// 实体模拟
class LoginUser{}
八、高并发计数 LongAdder 模板
业务场景
接口访问量、消息统计、海量数据累加
java
import java.util.concurrent.atomic.LongAdder;
public class HighConcurrentCountDemo {
// 分段累加,高并发远超AtomicLong
private static final LongAdder COUNT = new LongAdder();
// 自增
public static void incr() {
COUNT.increment();
}
// 获取总数
public static long getTotal() {
return COUNT.sum();
}
}
九、CompletableFuture 异步编排生产模板
业务场景
微服务接口聚合、多接口并行调用
java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureBizDemo {
// 并行执行多个任务
public static CompletableFuture<Void> batchTask() {
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
TimeUnit.MILLISECONDS.sleep(300);
return "接口1结果";
});
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
TimeUnit.MILLISECONDS.sleep(500);
return "接口2结果";
});
// 全部执行完成再汇总
return CompletableFuture.allOf(task1, task2)
.whenComplete((unused, throwable) -> {
if (throwable != null) {
// 全局异常捕获
throwable.printStackTrace();
}
});
}
public static void main(String[] args) throws Exception {
batchTask().join();
System.out.println("所有异步任务执行完成");
}
}
十、自定义线程池 + 自定义拒绝策略 完整投产模板
java
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;
/**
* 业务专用线程池 生产模板
*/
public class BizThreadPool {
// 核心线程
private static final int CORE = 8;
// 最大线程
private static final int MAX = 16;
// 空闲销毁时间
private static final long ALIVE_TIME = 60L;
// 有界队列容量
private static final int QUEUE_SIZE = 200;
// 自定义线程工厂,命名方便排查
private static final ThreadFactory THREAD_FACTORY = new ThreadFactoryBuilder()
.setNameFormat("biz-execute-pool-%d")
.setDaemon(false)
.build();
// 自定义拒绝策略
private static class CustomRejectHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
// 日志告警
System.err.println("业务线程池已满,触发自定义降级策略");
// 方案:交由调用者执行,平稳降级
new Thread(r).start();
}
}
// 单例线程池
private static final ThreadPoolExecutor BIZ_POOL = new ThreadPoolExecutor(
CORE,
MAX,
ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_SIZE),
THREAD_FACTORY,
new CustomRejectHandler()
);
// 对外提交任务
public static void execute(Runnable task) {
BIZ_POOL.execute(task);
}
// 获取线程池
public static ThreadPoolExecutor getPool() {
return BIZ_POOL;
}
}
十一、并发容器实战选用速记
java
// 1. 高并发键值存储
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
// 2. 读多写少集合
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
// 3. 阻塞队列 生产者消费者
BlockingQueue<String> queue = new ArrayBlockingQueue<>(500);
十二、生产通用并发编码规范
- 所有锁释放、计数释放、上下文清除一律写 finally
- 业务禁止使用
Executors快捷创建线程池 - 并发计数高并发优先
LongAdder,普通场景AtomicLong - 线程池内任务严禁使用
ThreadLocal不清理 - 同步工具类尽量设置超时时间,防止无限阻塞
- 读写锁严格区分读写场景,最大化并发性能
第二部分:Java并发全家桶
一、核心底层基石
- volatile 可见性、禁指令重排、不保证原子性;用于状态标记、双重校验锁
- CAS乐观锁无锁操作,自旋比较交换;缺点:ABA、自旋消耗、只能单变量
- AQS 队列同步器,
state状态 + CLH 双向队列 + LockSupport 阻塞唤醒
- 独占:ReentrantLock
- 共享:CountDownLatch/Semaphore
二、三大同步计数器(AQS 共享)
- CountDownLatch 倒计时递减,一次性不可复用 ;主线程等多子线程完成核心:
countDown()、await() - CyclicBarrier 凑齐指定线程一起执行,可循环复用 ;并发压测、批量同步核心:
await() - Semaphore 信号量限流,控制最大并发数;接口限流、资源配额核心:
acquire()、release()
三、显式锁体系
- ReentrantLock 可重入独占锁,支持公平 / 非公平、超时抢锁、可中断规范:
lock()try finallyunlock() - ReentrantReadWriteLock 读写分离:读读共享、读写 / 写写互斥;读多写少缓存场景支持锁降级,不支持锁升级
- StampedLockJDK8 高性能读写锁,乐观读无阻塞,杜绝线程饥饿
- Condition Lock 专属等待唤醒,多条件队列精准分组唤醒,替代 wait/notify
四、线程本地上下文
ThreadLocal 线程私有数据隔离,存用户登录态、链路 ID底层:Thread→ThreadLocalMap→Entry (key 弱引用,value 强引用)坑:线程池引发内存泄漏 ,用完必须remove()衍生:InheritableThreadLocal 父子线程传值
五、原子无锁类
- 基础原子:AtomicInteger、AtomicLong
- 高并发计数:LongAdder(分段求和,性能远超 Atomic)
- 引用原子:AtomicReference
- 解决 ABA:AtomicStampedReference
六、线程池体系
- 七大参数:核心线程、最大线程、空闲时长、时间单位、阻塞队列、线程工厂、拒绝策略
- 执行流程:核心满→入队列→队列满→开非核心→满则拒绝
- 常用队列ArrayBlockingQueue (有界推荐)、LinkedBlockingQueue、SynchronousQueue、DelayQueue
- 四大拒绝策略Abort 抛异常、CallerRuns 主线程执行、Discard 丢弃、DiscardOldest 丢队首
- 状态:RUNNING→SHUTDOWN→STOP→TIDYING→TERMINATED
- 规范:禁止 Executors,手动创建 ThreadPoolExecutor,自定义线程名
七、并发容器
- ConcurrentHashMapJDK1.7 分段锁、1.8 CAS+synchronized;高并发 KV 首选
- CopyOnWriteArrayList 写时复制,读无锁;读多写少专用
- 阻塞队列 BlockingQueue生产者消费者、线程池内核、消息缓冲
八、异步线程编排
CompletableFutureJDK8 最强异步工具allOf/anyOf 多任务组合、回调处理、异常捕获、接口并行聚合
九、线程通信与阻塞唤醒
- wait/notify:synchronized 配套,随机唤醒
- LockSupport:park/unpark,无锁阻塞,AQS 底层依赖
- Condition:精准唤醒
十、死锁核心
- 四大条件:互斥、请求持有、不可剥夺、循环等待
- 规避:统一加锁顺序、超时锁、缩小锁范围、减少嵌套
- 排查:jps+jstack
十一、线程六大状态
新建→就绪→运行→阻塞 BLOCKED→等待 WAITING→超时等待 TIMED_WAITING→终止
十二、场景极速选型
- 多任务汇总 → CountDownLatch
- 多线程同步起跑 → CyclicBarrier
- 接口限流控并发 → Semaphore
- 灵活可中断锁 → ReentrantLock
- 读多写少缓存 → 读写锁
- 线程上下文透传 → ThreadLocal
- 高并发统计计数 → LongAdder
- 并行接口调用 → CompletableFuture
- 高并发键值缓存 → ConcurrentHashMap
- 读多写少集合 → CopyOnWriteArrayList
- 任务队列削峰 → 阻塞队列
- 定时延时任务 → Scheduled 线程池 / DelayQueue
十三、并发避坑一句话
- 锁必放 finally 释放
- ThreadLocal 用完必清空
- 线程池务必用有界队列
- 高并发计数优先 LongAdder
- 多锁统一顺序防死锁
- 异步任务必须捕获异常
- 共享资源优先无锁 / 并发容器,少手写同步