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)

✅ 第三阶段:能设计

• 高并发限流

• 异步编排

• 线程池调优

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

相关推荐
维吉斯蔡2 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
幻影123!2 小时前
从零训练一个会下五子棋的AI
python·深度学习·神经网络·强化学习·五子棋·alpha zero·mokugo
蓝斯4972 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常2 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
都叫我大帅哥3 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-3 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
Python私教3 小时前
Django 接入 AI 大模型实战:从零做一个流式聊天网站
人工智能·python·django
Python私教3 小时前
Django 接入 MCP 实战:让 AI 安全调用数据库和业务接口
人工智能·python·django
前端工作日常3 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端
Python私教3 小时前
Django 搭建 AI 本地知识库:文档上传、向量检索与智能问答
人工智能·python·django