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 构造器配置生产者类型与等待策略。
相关推荐
xuhaoyu_cpp_java4 分钟前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev30 分钟前
kapt 替换为 KSP
android·java·kotlin
蜡台39 分钟前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
小喻同学i1 小时前
std::thread函数参数传递
开发语言·c++
程序员天天困1 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH1 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
Ulyanov2 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
分布式存储与RustFS2 小时前
RustFS Beta.10 性能解读:PUT 全面反超 MinIO,Rust 重写对象存储成了?
开发语言·后端·rust
小小的木头人3 小时前
Python 批量解析 Excel 经纬度,调用高德地图 API 获取中文地址
开发语言·python·excel
子非鱼94273 小时前
07-Flutter 鸿蒙实战 07:故事集列表与缓存设计
学习·flutter·缓存·华为·harmonyos