本文目录导读:

- ConcurrentHashMap 并发映射
- CopyOnWriteArrayList 并发列表
- BlockingQueue 阻塞队列
- ConcurrentLinkedQueue 并发链表队列
- 完整业务场景案例:分布式任务调度系统
- 并发集合性能对比
- 选择指南
我来为你提供Java并发集合的完整案例,涵盖常用的并发容器和实际应用场景。
ConcurrentHashMap 并发映射
基本使用案例
import java.util.concurrent.*;
import java.util.concurrent.atomic.LongAdder;
public class ConcurrentHashMapDemo {
// 案例1:统计单词频率
public static void wordCountDemo() {
ConcurrentHashMap<String, Integer> wordCount = new ConcurrentHashMap<>();
// 模拟多线程写入
ExecutorService executor = Executors.newFixedThreadPool(4);
String[] words = {"Java", "Python", "Java", "Go", "Java", "Python"};
for (String word : words) {
executor.submit(() -> {
// 使用compute方法原子更新
wordCount.compute(word, (key, val) -> val == null ? 1 : val + 1);
});
}
executor.shutdown();
try {
executor.awaitTermination(5, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Word count: " + wordCount);
}
// 案例2:缓存示例
public static void cacheDemo() throws InterruptedException {
ConcurrentHashMap<String, String> cache = new ConcurrentHashMap<>();
// 使用putIfAbsent实现缓存
String value = cache.putIfAbsent("key1", "value1");
System.out.println("First put: " + value); // null
value = cache.putIfAbsent("key1", "newValue");
System.out.println("Second put: " + value); // value1
System.out.println("Cache value: " + cache.get("key1"));
}
public static void main(String[] args) throws InterruptedException {
wordCountDemo();
cacheDemo();
}
}
CopyOnWriteArrayList 并发列表
读写分离案例
import java.util.concurrent.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListDemo {
// 读多写少场景
public static void readWriteDemo() {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
list.add("C");
// 多个读线程
Runnable reader = () -> {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+ " reading: " + list);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// 写线程
Runnable writer = () -> {
for (int i = 0; i < 3; i++) {
list.add("Element-" + i);
System.out.println(Thread.currentThread().getName()
+ " added element");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
ExecutorService pool = Executors.newFixedThreadPool(4);
// 3个读线程
for (int i = 0; i < 3; i++) {
pool.submit(reader);
}
// 1个写线程
pool.submit(writer);
pool.shutdown();
}
// 迭代器弱一致性
public static void iteratorDemo() {
CopyOnWriteArrayList<Integer> numbers =
new CopyOnWriteArrayList<>();
for (int i = 0; i < 10; i++) {
numbers.add(i);
}
// 迭代时修改
Thread iteratorThread = new Thread(() -> {
for (Integer num : numbers) {
System.out.println("Iterating: " + num);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread modifierThread = new Thread(() -> {
for (int i = 10; i < 15; i++) {
numbers.add(i);
System.out.println("Added: " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
iteratorThread.start();
modifierThread.start();
try {
iteratorThread.join();
modifierThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
readWriteDemo();
// iteratorDemo();
}
}
BlockingQueue 阻塞队列
生产者-消费者模式
import java.util.concurrent.*;
public class BlockingQueueDemo {
// 使用ArrayBlockingQueue实现生产者消费者
public static void producerConsumerDemo() {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(5);
// 生产者
Thread producer = new Thread(() -> {
try {
int item = 0;
while (item < 10) {
String product = "Product-" + item;
queue.put(product); // 队列满时阻塞
System.out.println("Produced: " + product);
item++;
Thread.sleep(200);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}, "Producer");
// 消费者
Thread consumer = new Thread(() -> {
try {
while (true) {
String product = queue.take(); // 队列空时阻塞
System.out.println("Consumed: " + product);
Thread.sleep(300);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}, "Consumer");
producer.start();
consumer.start();
try {
producer.join();
// 给消费者一些时间处理剩余任务
Thread.sleep(2000);
consumer.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 延迟队列
public static void delayQueueDemo() throws InterruptedException {
DelayQueue<DelayedTask> queue = new DelayQueue<>();
// 添加延迟任务
queue.put(new DelayedTask("Task1", 2000));
queue.put(new DelayedTask("Task2", 1000));
queue.put(new DelayedTask("Task3", 3000));
System.out.println("Waiting for delayed tasks...");
while (!queue.isEmpty()) {
DelayedTask task = queue.take(); // 阻塞直到延迟到期
System.out.println("Executed: " + task.taskName
+ " at " + System.currentTimeMillis());
}
}
// 延迟任务类
static class DelayedTask implements Delayed {
private String taskName;
private long delayTime;
public DelayedTask(String taskName, long delayMillis) {
this.taskName = taskName;
this.delayTime = System.currentTimeMillis() + delayMillis;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(delayTime - System.currentTimeMillis(),
TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.delayTime,
((DelayedTask)o).delayTime);
}
}
public static void main(String[] args) throws InterruptedException {
producerConsumerDemo();
System.out.println("\n--- Delay Queue Demo ---");
delayQueueDemo();
}
}
ConcurrentLinkedQueue 并发链表队列
无界队列使用
import java.util.concurrent.*;
public class ConcurrentLinkedQueueDemo {
public static void main(String[] args) throws InterruptedException {
ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();
// 多线程写入
Runnable producer = () -> {
for (int i = 0; i < 100; i++) {
queue.offer(Thread.currentThread().getName().hashCode() + i);
}
};
// 多线程读取
Runnable consumer = () -> {
long count = 0;
while (count < 100) {
Integer item = queue.poll();
if (item != null) {
count++;
// 处理数据
System.out.println("Processed: " + item);
}
}
};
ExecutorService pool = Executors.newFixedThreadPool(4);
// 2个生产者
pool.submit(producer);
pool.submit(producer);
// 等待生产者完成
pool.awaitTermination(2, TimeUnit.SECONDS); // 简化处理
// 2个消费者
pool.submit(consumer);
pool.submit(consumer);
pool.shutdown();
pool.awaitTermination(5, TimeUnit.SECONDS);
System.out.println("Queue size: " + queue.size());
}
}
完整业务场景案例:分布式任务调度系统
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
public class ConcurrentCollectionCompleteDemo {
// 任务类
static class Task {
private String taskId;
private int priority;
public Task(String taskId, int priority) {
this.taskId = taskId;
this.priority = priority;
}
@Override
public String toString() {
return "Task{" + taskId + ", priority=" + priority + "}";
}
}
// 任务调度器
static class TaskScheduler {
// 高优先级任务队列
private final PriorityBlockingQueue<Task> highPriorityQueue =
new PriorityBlockingQueue<>(10, (t1, t2) ->
Integer.compare(t2.priority, t1.priority));
// 普通任务队列
private final BlockingQueue<Task> normalQueue =
new LinkedBlockingQueue<>();
// 已完成任务集合
private final ConcurrentSkipListSet<String> completedTasks =
new ConcurrentSkipListSet<>();
// 任务计数器
private final AtomicLong taskCounter = new AtomicLong();
// 任务处理结果缓存
private final ConcurrentHashMap<String, String> taskResults =
new ConcurrentHashMap<>();
// 提交高优先级任务
public void submitHighPriorityTask(Task task) {
highPriorityQueue.offer(task);
System.out.println(Thread.currentThread().getName()
+ " submitted high priority: " + task);
}
// 提交普通任务
public void submitNormalTask(Task task) {
normalQueue.offer(task);
System.out.println(Thread.currentThread().getName()
+ " submitted normal: " + task);
}
// 处理任务
public void processTasks() throws InterruptedException {
// 优先处理高优先级任务
Task highTask = null;
Task normalTask = null;
// 尝试获取高优先级任务
highTask = highPriorityQueue.poll(100, TimeUnit.MILLISECONDS);
if (highTask == null) {
// 尝试获取普通任务
normalTask = normalQueue.poll(100, TimeUnit.MILLISECONDS);
}
if (highTask != null) {
handleTask(highTask);
} else if (normalTask != null) {
handleTask(normalTask);
} else {
// 没有任务时休眠
Thread.sleep(100);
}
}
private void handleTask(Task task) {
// 检查是否已完成
if (completedTasks.contains(task.taskId)) {
return;
}
// 模拟处理
try {
Thread.sleep(100);
String result = "Processed " + task + " at "
+ System.currentTimeMillis();
taskResults.put(task.taskId, result);
completedTasks.add(task.taskId);
taskCounter.incrementAndGet();
System.out.println(Thread.currentThread().getName()
+ " completed: " + task);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public void printStatistics() {
System.out.println("\n=== Scheduler Statistics ===");
System.out.println("Completed tasks: " + taskCounter.get());
System.out.println("Completed set size: " + completedTasks.size());
System.out.println("Results cache size: " + taskResults.size());
System.out.println("Pending high priority: " + highPriorityQueue.size());
System.out.println("Pending normal: " + normalQueue.size());
}
}
public static void main(String[] args) throws InterruptedException {
TaskScheduler scheduler = new TaskScheduler();
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(3);
// 提交任务
executor.submit(() -> {
for (int i = 0; i < 5; i++) {
scheduler.submitHighPriorityTask(
new Task("High-" + i, 100 - i));
try {
Thread.sleep(200);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
executor.submit(() -> {
for (int i = 0; i < 5; i++) {
scheduler.submitNormalTask(
new Task("Normal-" + i, 0));
try {
Thread.sleep(300);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
});
// 处理线程
executor.submit(() -> {
try {
while (true) {
scheduler.processTasks();
Thread.sleep(100);
// 简单停止条件
if (Thread.currentThread().isInterrupted()) {
break;
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
// 运行一段时间后停止
Thread.sleep(10000);
executor.shutdownNow();
// 等待线程池关闭
executor.awaitTermination(5, TimeUnit.SECONDS);
// 打印统计信息
scheduler.printStatistics();
}
}
并发集合性能对比
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicLong;
public class PerformanceComparison {
public static void main(String[] args) throws InterruptedException {
// HashMap vs ConcurrentHashMap
compareMaps();
// ArrayList vs CopyOnWriteArrayList
compareLists();
// synchronized vs ConcurrentLinkedQueue
compareQueues();
}
private static void compareMaps() throws InterruptedException {
int iterations = 10000;
// HashMap(非线程安全)
Map<String, Integer> hashMap = new HashMap<>();
long start = System.nanoTime();
// 使用时需要同步
Object lock = new Object();
ExecutorService pool = Executors.newFixedThreadPool(4);
// 使用同步的HashMap
Runnable syncMapTask = () -> {
Random random = new Random();
for (int i = 0; i < iterations; i++) {
synchronized (lock) {
hashMap.put("key-" + random.nextInt(1000), i);
}
}
};
for (int i = 0; i < 4; i++) {
pool.submit(syncMapTask);
}
pool.shutdown();
pool.awaitTermination(10, TimeUnit.SECONDS);
long hashMapTime = System.nanoTime() - start;
// ConcurrentHashMap
Map<String, Integer> concurrentMap = new ConcurrentHashMap<>();
start = System.nanoTime();
pool = Executors.newFixedThreadPool(4);
Runnable concurrentMapTask = () -> {
Random random = new Random();
for (int i = 0; i < iterations; i++) {
concurrentMap.put("key-" + random.nextInt(1000), i);
}
};
for (int i = 0; i < 4; i++) {
pool.submit(concurrentMapTask);
}
pool.shutdown();
pool.awaitTermination(10, TimeUnit.SECONDS);
long concurrentMapTime = System.nanoTime() - start;
System.out.println("HashMap (synchronized): "
+ hashMapTime / 1_000_000 + "ms");
System.out.println("ConcurrentHashMap: "
+ concurrentMapTime / 1_000_000 + "ms");
}
private static void compareLists() {
int elements = 10000;
// CopyOnWriteArrayList 写入
CopyOnWriteArrayList<Integer> cowList = new CopyOnWriteArrayList<>();
long start = System.nanoTime();
for (int i = 0; i < elements; i++) {
cowList.add(i);
}
long cowWriteTime = System.nanoTime() - start;
// 读取
start = System.nanoTime();
int sum = 0;
for (Integer value : cowList) {
sum += value;
}
long cowReadTime = System.nanoTime() - start;
System.out.println("\nCopyOnWriteArrayList:");
System.out.println(" Write time: " + cowWriteTime / 1_000_000 + "ms");
System.out.println(" Read time: " + cowReadTime / 1_000_000 + "ms");
}
private static void compareQueues() throws InterruptedException {
int tasks = 10000;
// ArrayBlockingQueue
BlockingQueue<Integer> arrayQueue = new ArrayBlockingQueue<>(100000);
long start = System.nanoTime();
for (int i = 0; i < tasks; i++) {
arrayQueue.offer(i);
}
for (int i = 0; i < tasks; i++) {
arrayQueue.poll();
}
long arrayQueueTime = System.nanoTime() - start;
// ConcurrentLinkedQueue
ConcurrentLinkedQueue<Integer> concurrentQueue =
new ConcurrentLinkedQueue<>();
start = System.nanoTime();
for (int i = 0; i < tasks; i++) {
concurrentQueue.offer(i);
}
for (int i = 0; i < tasks; i++) {
concurrentQueue.poll();
}
long concurrentQueueTime = System.nanoTime() - start;
System.out.println("\nQueue Performance:");
System.out.println("ArrayBlockingQueue: "
+ arrayQueueTime / 1_000_000 + "ms");
System.out.println("ConcurrentLinkedQueue: "
+ concurrentQueueTime / 1_000_000 + "ms");
}
}
选择指南
public class CollectionSelectionGuide {
public static void main(String[] args) {
System.out.println("=== 并发集合选择指南 ===");
System.out.println("""
1. ConcurrentHashMap
- 读多写少场景
- 高并发map操作
- 需要原子性操作(compute, putIfAbsent)
2. CopyOnWriteArrayList
- 读多写极少场景
- 需要弱一致性迭代
- 集合经常被遍历
3. BlockingQueue 系列
- 生产者-消费者模式
- 需要阻塞特性
- 有界队列(ArrayBlockingQueue)
- 无界队列(LinkedBlockingQueue)
4. ConcurrentLinkedQueue
- 高并发无界队列
- 不需要阻塞
- CAS操作实现
5. PriorityBlockingQueue
- 需要优先级排序
- 阻塞队列+优先级
6. DelayQueue
- 延迟任务处理
- 定时任务调度
7. ConcurrentSkipListMap/Set
- 需要排序
- 并发有序结构
- 不可重复(Set)或可重复(Map)
""");
}
}
这些案例涵盖了Java并发集合的主要使用场景和最佳实践,实际开发中,应根据具体需求选择合适的并发集合:考虑操作的读写比例、是否需要阻塞、是否需要排序、以及性能要求等因素。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播