Java 并发编程 — 并发容器 + CPU 缓存 + Disruptor

一、并发容器(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 构造器配置生产者类型与等待策略。
相关推荐
devmoon7 小时前
运行时(Runtime)是什么?为什么 Polkadot 的 Runtime 可以被“像搭积木一样”定制
开发语言·区块链·智能合约·polkadot·runtmie
丶小鱼丶7 小时前
并发编程之【优雅地结束线程的执行】
java
市场部需要一个软件开发岗位7 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿8 小时前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
沐知全栈开发8 小时前
API 类别 - 交互
开发语言
MZ_ZXD0018 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东8 小时前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology8 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble8 小时前
springboot的核心实现机制原理
java·spring boot·后端