java 并发编程

Java 并发编程是进阶路上最难、也是含金量最高的一关。

下面我用"面试 + 实战 + 源码"三层结构,帮你把并发体系一次捋清楚。

一、并发的三大核心问题(先记住)

问题 说明 后果

可见性 一个线程改了变量,另一个线程看不见 读到旧值

原子性 操作被打断 数据错乱

有序性 指令重排序 逻辑异常

✅ JMM(Java 内存模型)就是为了解决这三个问题

二、线程基础(必须扎实)

1️⃣ 创建线程的 3 种方式

// 1. Thread

new Thread(() -> {}).start();

// 2. Runnable

new Thread(new MyRunnable()).start();

// 3. Callable + Future

FutureTask task = new FutureTask<>(() -> "ok");

new Thread(task).start();

✅ 推荐:Runnable / Callable(解耦)

2️⃣ 线程状态(面试必考)

NEW → RUNNABLE ↔ BLOCKED → WAITING → TIMED_WAITING → TERMINATED

状态 触发

BLOCKED synchronized

WAITING wait() / join()

TIMED_WAITING sleep(time)

三、锁机制(重中之重)

1️⃣ synchronized(JDK 内置)

✅ 特性:

• 可重入

• 非公平

• JVM 层面实现

✅ 锁升级(JDK 8+):

无锁 → 偏向锁 → 轻量级锁 → 重量级锁

📌 面试高频

synchronized 能保证可见性吗?

✅ 能(解锁前刷新主内存)

2️⃣ Lock 接口(JUC)

锁 特点

ReentrantLock 可重入、可中断

ReadWriteLock 读写分离

StampedLock 乐观读(更高性能)

ReentrantLock lock = new ReentrantLock();

lock.lock();

try {

// do something

} finally {

lock.unlock();

}

✅ Lock vs synchronized

• Lock:灵活、可中断、公平锁

• synchronized:简单、JVM 优化好

四、线程池(并发的灵魂)

1️⃣ ThreadPoolExecutor 核心参数

new ThreadPoolExecutor(

corePoolSize,

maximumPoolSize,

keepAliveTime,

TimeUnit.SECONDS,

new LinkedBlockingQueue<>(100),

new ThreadPoolExecutor.AbortPolicy()

);

参数 作用

corePoolSize 常驻线程

maximumPoolSize 最大线程

workQueue 任务队列

RejectedExecutionHandler 拒绝策略

2️⃣ 执行流程(面试必背)

提交任务

核心线程是否满?

队列是否满?

最大线程是否满?

拒绝策略

✅ 拒绝策略

• AbortPolicy(抛异常)

• CallerRunsPolicy(调用者线程执行)

• DiscardPolicy(直接丢弃)

五、并发工具类(JUC 精华)

工具 用途

CountDownLatch 等待多线程完成

CyclicBarrier 线程相互等待

Semaphore 限流

Exchanger 线程间交换数据

✅ 高频场景

• 压测

• 批量任务汇总

• 限流控制

六、并发容器(替代 synchronized 集合)

容器 特点

ConcurrentHashMap 高并发 KV

CopyOnWriteArrayList 读多写少

BlockingQueue 生产者消费者

ConcurrentLinkedQueue 高性能无锁队列

✅ CopyOnWrite 缺点

• 写成本高

• 数据可能滞后

七、并发设计模式(拉开差距)

✅ Worker Thread

✅ Producer-Consumer

✅ Thread Local

✅ Future / Promise

八、常见并发陷阱(面试连环问)

❌ volatile 不能保证原子性

❌ i++ 不是线程安全的

❌ 线程池不要使用 Executors 创建

❌ ThreadLocal 用完要 remove()

九、并发学习路线(强烈推荐)

✅ 第一阶段:会用

• Thread / Runnable

• synchronized

• volatile

• ThreadPoolExecutor

✅ 第二阶段:懂原理

• JMM

• happens-before

• 锁升级

• AQS(AbstractQueuedSynchronizer)

✅ 第三阶段:能设计

• 高并发限流

• 异步编排

• 线程池调优

十、下一步我可以帮你做什么?

相关推荐
用户298698530143 小时前
Word 文档字符级格式化:Java 实现方案详解
java·后端
曲幽3 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
笨鸟飞不快3 小时前
从单个服务到集群:一次完整的性能排查复盘
java·前端
荣码3 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
SamDeepThinking3 小时前
Java微服务练习方式
java·后端·微服务
兵慌码乱13 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
朦胧之14 小时前
AI 编程-老项目改造篇
java·前端·后端
金銀銅鐵14 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio18 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
程序猿大帅18 小时前
别再只当调包侠了:用 Spring AI 落地 Function Calling,我被大模型硬生生砸出了三个大坑
java