Java并发集合
外观
Java并发集合是Java集合框架中为多线程环境设计的一组线程安全容器类,位于java.util.concurrent
包中。它们通过高效的并发控制机制(如CAS操作、分段锁等)解决了传统集合(如ArrayList
、HashMap
)在多线程下的性能与安全问题。
概述[编辑 | 编辑源代码]
Java并发集合的核心目标是:
- 线程安全:无需外部同步即可在多线程环境下使用。
- 高性能:通过细粒度锁或无锁算法减少竞争。
- 可扩展性:适合高并发场景。
与使用Collections.synchronizedXXX()
包装的集合相比,并发集合在吞吐量和一致性上更具优势。
主要并发集合类[编辑 | 编辑源代码]
以下是java.util.concurrent
包中的关键实现:
1. ConcurrentHashMap[编辑 | 编辑源代码]
高并发优化的哈希表,通过分段锁(JDK 7)或CAS+synchronized(JDK 8+)实现线程安全。
示例代码:
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.putIfAbsent("B", 2); // 原子操作
System.out.println(map.get("A")); // 输出: 1
}
}
2. CopyOnWriteArrayList[编辑 | 编辑源代码]
通过写时复制(Copy-On-Write)实现的线程安全列表,适合读多写少的场景。
示例代码:
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteExample {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("Java");
list.add("Python");
list.forEach(System.out::println); // 线程安全遍历
}
}
3. BlockingQueue 接口[编辑 | 编辑源代码]
支持阻塞操作的队列,常用于生产者-消费者模型。实现类包括:
ArrayBlockingQueue
:基于数组的有界队列LinkedBlockingQueue
:基于链表的可选有界队列
示例代码:
import java.util.concurrent.ArrayBlockingQueue;
public class BlockingQueueExample {
public static void main(String[] args) throws InterruptedException {
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(3);
queue.put("Task1"); // 阻塞直到空间可用
String task = queue.take(); // 阻塞直到元素可用
}
}
并发控制机制[编辑 | 编辑源代码]
Java并发集合通过以下技术实现线程安全:
数学上,CAS操作可以表示为:
实际应用案例[编辑 | 编辑源代码]
场景:Web服务器请求计数器
使用ConcurrentHashMap
统计不同API的访问次数:
import java.util.concurrent.ConcurrentHashMap;
public class RequestCounter {
private final ConcurrentHashMap<String, Integer> counter = new ConcurrentHashMap<>();
public void increment(String apiPath) {
counter.compute(apiPath, (k, v) -> (v == null) ? 1 : v + 1);
}
public int getCount(String apiPath) {
return counter.getOrDefault(apiPath, 0);
}
}
性能对比[编辑 | 编辑源代码]
操作 | ConcurrentHashMap |
Collections.synchronizedMap
|
---|---|---|
读操作 | 无锁 | 全表锁 |
写操作 | 分段锁/CAS | 全表锁 |
最佳实践[编辑 | 编辑源代码]
- 优先使用
ConcurrentHashMap
而非Hashtable
- 读多写少时选择
CopyOnWriteArrayList
- 避免在迭代过程中修改
ConcurrentHashMap
(弱一致性迭代器)