Skip to content

🔄 并发编程高级

并发编程高级主题

深入学习并发编程的高级技术和最佳实践。

关注点:可见性/有序性 → 锁竞争与伪共享 → 无锁/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 开发的重要技能,需要深入理解线程安全和锁机制