一、并发容器(JUC 核心容器)
1. 核心定位与分类
- 背景:ArrayList、HashMap 等基础集合非线程安全,Vector、Hashtable 等同步容器因全局锁导致并发性能低,JUC 并发容器平衡线程安全与吞吐量。
- 核心分类 :
- List:CopyOnWriteArrayList(替代 Vector/SynchronizedList)
- Set:CopyOnWriteArraySet(基于 CopyOnWriteArrayList)、ConcurrentSkipListSet
- Map:ConcurrentHashMap(替代 Hashtable/SynchronizedMap)、ConcurrentSkipListMap(替代 SynchronizedSortedMap)
- Queue:ArrayBlockingQueue、LinkedBlockingQueue 等(含阻塞 / 非阻塞类型)
2. 关键容器原理与场景
| 容器类 | 核心原理 | 适用场景 | 优缺点 |
|---|---|---|---|
| CopyOnWriteArrayList | 写时复制 + 锁 + volatile,读无锁、写复制数组 | 读多写少、无需实时更新(如 IP 黑名单) | 读性能高、无并发修改异常;内存占用高、写开销大 |
| CopyOnWriteArraySet | 基于 CopyOnWriteArrayList,add 调用 addIfAbsent 去重 | 需去重的读多写少场景 | 继承 CopyOnWriteArrayList 特性 |
| ConcurrentHashMap | JDK7 分段锁,JDK8+ CAS+synchronized + 数组 / 链表 / 红黑树(树化条件:链表≥8 且数组≥64) | 高并发缓存、共享数据存储 | 支持复合操作、并发高效;红黑树高并发增删代价高 |
| ConcurrentSkipListMap | 基于跳表(有序、O (log n) 复杂度) | 高并发有序映射、高频增删改(大数据量) | 有序、增删效率优于红黑树;内存开销略高 |
3. 迭代器机制与电商选型
- Fail-Fast vs Fail-Safe:普通集合(ArrayList/HashMap)为 Fail-Fast(并发修改抛异常),并发容器为 Fail-Safe(遍历复制集合,无异常但最终一致)。
- 电商场景选型 :
- 商品售卖数量统计:ConcurrentHashMap(高频 get/set,key 稳定)
- 用户浏览历史统计:ConcurrentSkipListMap(大数据量、高频增删)
- 冻结用户列表:CopyOnWriteArrayList(高频读、低频写)
二、CPU 缓存架构与一致性
1. 核心架构与局部性原理
- 三级缓存结构:L1(核心独占)→ L2(核心独占)→ L3(多核共享)→ 主存,速度递减、容量递增。
- 局部性原理:时间局部性(重复访问数据)、空间局部性(连续访问数据),缓存设计的核心依据。
2. 缓存一致性问题与解决方案
- 问题:多核场景下,共享数据的缓存副本不一致,导致数据错误。
- 核心方案 :
- 原子操作指令(XADD、CMPXCHG 等):硬件级保证原子性。
- 总线锁定(LOCK# 信号):适用于不可缓存数据或跨缓存行操作。
- 缓存一致性协议(MESI 为主):基于写失效机制,缓存行状态分为 Modified(修改)、Exclusive(独占)、Shared(共享)、Invalid(无效)。
3. 伪共享与规避方案
- 伪共享:不同线程操作同一缓存行的无关变量,导致频繁缓存失效(如 ArrayBlockingQueue 的三个成员变量)。
- 规避方法:缓存行填充(添加无用字段占满 64Byte)、@Contended 注解(需 JVM 参数 -XX:-RestrictContended)、ThreadLocal 本地内存。
三、高性能内存队列 Disruptor
1. 核心定位与 JUC 队列缺陷
- 定位:LMAX 开发的有界内存队列,主打高并发、低延迟(单线程支撑 600 万订单 / 秒),应用于 Log4j2、Apache Storm 等。
- JUC 队列缺陷:加锁导致性能低、有界队列存在伪共享、线程切换开销大。
2. 高性能设计亮点
- 环形数组结构:避免 GC,契合缓存空间局部性。
- 无锁设计:CAS 保证线程安全,无锁竞争开销。
- 2^n 数组长度:位运算快速定位下标(index = sequence & (length-1))。
- 缓存行填充:解决伪共享问题。
- 事件驱动模型:观察者模式,消费者实时响应数据。
3. 关键组件与实战
- 核心组件:RingBuffer(环形数组)、EventFactory(事件工厂)、Producer(生产者)、Consumer(消费者)、WaitStrategy(等待策略)。
- 等待策略选型 :
- 高吞吐低延迟:BusySpinWaitStrategy(绑定 CPU 核心)
- 平衡性能与 CPU:YieldingWaitStrategy、SleepingWaitStrategy
- 资源紧缺场景:BlockingWaitStrategy、TimeoutBlockingWaitStrategy
- 实战模式:单生产者单消费者、单生产者多消费者(重复消费 / 分片消费)、多生产者多消费者,通过 Disruptor 构造器配置生产者类型与等待策略。