并发容器
外观
并发容器[编辑 | 编辑源代码]
并发容器是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的演进[编辑 | 编辑源代码]
数学公式展示哈希冲突概率(泊松分布):
性能对比测试[编辑 | 编辑源代码]
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没有内容。
避免过度依赖并发容器的原子性,复合操作仍需显式同步。 |