Appearance
🔄 并发编程高级
并发编程高级主题
深入学习并发编程的高级技术和最佳实践。
关注点:可见性/有序性 → 锁竞争与伪共享 → 无锁/CAS → 可伸缩性与活性线程安全
线程安全集合
java
// 线程安全的集合
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
// 使用同步包装
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());原子类
java
// 原子类
AtomicInteger count = new AtomicInteger(0);
count.incrementAndGet();
count.compareAndSet(0, 10);LongAdder/Striped(高并发计数)
java
LongAdder adder = new LongAdder();
IntStream.range(0, 1_000_000).parallel().forEach(i -> adder.increment());
long sum = adder.sum();锁机制
ReentrantLock
java
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}ReadWriteLock
java
ReadWriteLock rwLock = new ReentrantReadWriteLock();
Lock readLock = rwLock.readLock();
Lock writeLock = rwLock.writeLock();StampedLock(乐观读)
java
var lock = new StampedLock();
long stamp = lock.tryOptimisticRead();
int x = data;
if (!lock.validate(stamp)) { stamp = lock.readLock(); try { x = data; } finally { lock.unlockRead(stamp);} }锁优化与避免死锁
- 尽量细粒度与短临界区;统一加锁顺序;超时获取;锁分离(读写/段锁);避免在锁内调用外部不可信代码。
无锁与并发容器
java
ConcurrentLinkedQueue<Integer> q = new ConcurrentLinkedQueue<>();
q.offer(1); q.poll();要点:CAS 失败重试、自旋开销、ABA 问题(AtomicStampedReference)。
背压与限流
生产速度 > 消费速度 → 队列积压 → 延迟/内存压力
解决:限流(RateLimiter/漏桶)、拒绝策略、丢弃旧任务、分级队列线程池深度实践
java
ThreadPoolExecutor pool = new ThreadPoolExecutor(
8, 32, 60, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(2000),
new ThreadFactoryBuilder().setNameFormat("biz-%d").build(),
new ThreadPoolExecutor.CallerRunsPolicy()
);监控:活跃线程、队列长度、拒绝次数、任务耗时分布(JFR/日志)。
并发 Bug 图谱
- 死锁/活锁/饥饿;丢失更新;发布与逸出;Double-Checked 错误写法;
- 伪共享:使用
@Contended或字段填充; - ThreadLocal 泄漏:线程池复用下记得 remove。
实战:多阶段流水线(Phaser)
java
Phaser ph = new Phaser(1);
for (int i=0;i<4;i++){ ph.register(); new Thread(() -> { ph.arriveAndAwaitAdvance(); step2(); ph.arriveAndDeregister(); }).start(); }
ph.arriveAndDeregister();下一步
掌握了并发编程高级后,可以继续学习:
- 分布式与微服务 - 学习分布式系统
- Java 面试与工程能力 - 提升面试能力
💡 提示:并发编程是 Java 开发的重要技能,需要深入理解线程安全和锁机制
