跳转到内容

并发容器

来自代码酷

模板:Note

并发容器[编辑 | 编辑源代码]

并发容器是Java并发编程中提供的一组线程安全的集合类,用于在多线程环境下高效地共享和操作数据。与传统的同步容器(如

Collections.synchronizedList

)相比,它们通过更细粒度的锁或无锁算法(如CAS)实现更高的性能。

核心并发容器分类[编辑 | 编辑源代码]

Java的

java.util.concurrent

包提供了以下主要并发容器:

1. ConcurrentHashMap[编辑 | 编辑源代码]

  • 特点:线程安全的哈希表,分段锁(JDK7)或CAS+红黑树(JDK8+)实现。
  • 适用场景:高并发读写,如缓存系统。
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key1", 1);
System.out.println(map.get("key1")); // 输出: 1

2. CopyOnWriteArrayList[编辑 | 编辑源代码]

  • 特点:写操作时复制新数组,读操作无锁。
  • 适用场景:读多写少,如事件监听器列表。
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("item1");
System.out.println(list.get(0)); // 输出: item1

3. BlockingQueue系列[编辑 | 编辑源代码]

阻塞队列对比
类型 特点 示例
ArrayBlockingQueue 固定大小数组实现
new ArrayBlockingQueue<>(10)
LinkedBlockingQueue 可选无界链表实现
new LinkedBlockingQueue<>()
PriorityBlockingQueue 优先级排序的无界队列
new PriorityBlockingQueue<>()

实现原理深度解析[编辑 | 编辑源代码]

ConcurrentHashMap的演进[编辑 | 编辑源代码]

graph LR JDK7-->|分段锁|Segment[Segment数组] JDK8-->|CAS+synchronized|Node[桶节点锁]

数学公式展示哈希冲突概率(泊松分布): P(k)=eλλkk!

性能对比测试[编辑 | 编辑源代码]

Collections.synchronizedMap

vs

ConcurrentHashMap

在4线程环境下的吞吐量:

  • 读操作:ConcurrentHashMap快3-5倍
  • 写操作:ConcurrentHashMap快2-3倍

实战案例:电商库存系统[编辑 | 编辑源代码]

// 使用ConcurrentHashMap实现库存管理
ConcurrentHashMap<String, AtomicInteger> inventory = new ConcurrentHashMap<>();
inventory.put("product1", new AtomicInteger(100));

// 安全扣减库存
int oldValue, newValue;
do {
    oldValue = inventory.get("product1").get();
    newValue = oldValue - 1;
} while (!inventory.get("product1").compareAndSet(oldValue, newValue));

高级技巧与陷阱[编辑 | 编辑源代码]

  • 误区1:认为
    size()
    
    方法返回精确值(实际是近似值)
  • 技巧:使用
    computeIfAbsent
    
    原子化复合操作
  • 内存一致性:happens-before规则保证可见性

总结[编辑 | 编辑源代码]

并发容器选用指南
场景 推荐容器
高频读写键值对 ConcurrentHashMap
读多写少列表 CopyOnWriteArrayList
生产者-消费者模式 BlockingQueue

页面模块:Message box/ambox.css没有内容。