# Java 并发集合有哪些

Java 提供了多种并发集合类，用于在多线程环境下安全地操作数据。这些集合类位于 `java.util.concurrent` 包中，相比于传统的集合类（如 `ArrayList`、`HashMap`），它们通过锁、CAS（Compare-And-Swap）等机制实现了线程安全。以下是常见的 Java 并发集合及其特点：

### **1. 并发 List**
+ `CopyOnWriteArrayList`  
    - 特点：写操作时复制底层数组，读操作无锁，适合读多写少的场景。
    - 优点：读操作性能高，线程安全。
    - 缺点：写操作性能较差，因为每次写操作都会复制整个数组。
    - 适用场景：读多写少，例如事件监听器列表。

### **2. 并发 Set**
+ `CopyOnWriteArraySet`  
    - 特点：基于 `CopyOnWriteArrayList` 实现，适合读多写少的场景。
    - 优点：线程安全，读操作性能高。
    - 缺点：写操作性能较差。
    - 适用场景：读多写少，例如缓存中的唯一值集合。
+ `ConcurrentSkipListSet`  
    - 特点：基于跳表（Skip List）实现，元素有序。
    - 优点：线程安全，支持高效的范围查询。
    - 缺点：内存占用较高。
    - 适用场景：需要有序且线程安全的集合。

### **3. 并发 Map**
+ `ConcurrentHashMap`  
    - 特点：基于分段锁（JDK 7）或 CAS + synchronized（JDK 8 及以后）实现，支持高并发。
    - 优点：线程安全，性能优于 `Hashtable` 和 `Collections.synchronizedMap`。
    - 缺点：不支持强一致性（如迭代器弱一致性）。
    - 适用场景：高并发环境下的键值对存储。
+ `ConcurrentSkipListMap`  
    - 特点：基于跳表实现，键有序。
    - 优点：线程安全，支持高效的范围查询。
    - 缺点：内存占用较高。
    - 适用场景：需要有序且线程安全的键值对存储。

### **4. 并发 Queue**
+ `ConcurrentLinkedQueue`  
    - 特点：基于链表实现的无界非阻塞队列。
    - 优点：线程安全，高性能。
    - 缺点：无界队列，可能导致内存溢出。
    - 适用场景：高并发环境下的任务队列。
+ `LinkedBlockingQueue`  
    - 特点：基于链表实现的可选有界阻塞队列。
    - 优点：线程安全，支持阻塞操作。
    - 缺点：有界队列可能限制吞吐量。
    - 适用场景：生产者-消费者模型。
+ `ArrayBlockingQueue`  
    - 特点：基于数组实现的有界阻塞队列。
    - 优点：线程安全，支持阻塞操作。
    - 缺点：固定容量，可能限制吞吐量。
    - 适用场景：固定大小的任务队列。
+ `PriorityBlockingQueue`  
    - 特点：基于堆实现的无界优先级阻塞队列。
    - 优点：线程安全，支持优先级排序。
    - 缺点：无界队列，可能导致内存溢出。
    - 适用场景：需要优先级排序的任务队列。
+ `SynchronousQueue`  
    - 特点：不存储元素的阻塞队列，每个插入操作必须等待一个移除操作。
    - 优点：线程安全，适合直接传递任务。
    - 缺点：容量为零，可能限制吞吐量。
    - 适用场景：直接传递任务的场景。

### **5. 并发 Deque**
+ `ConcurrentLinkedDeque`  
    - 特点：基于链表实现的无界非阻塞双端队列。
    - 优点：线程安全，高性能。
    - 缺点：无界队列，可能导致内存溢出。
    - 适用场景：高并发环境下的双端队列。
+ `LinkedBlockingDeque`  
    - 特点：基于链表实现的可选有界阻塞双端队列。
    - 优点：线程安全，支持阻塞操作。
    - 缺点：有界队列可能限制吞吐量。
    - 适用场景：需要双端操作的阻塞队列。

### **6. 其他并发工具**
+ `BlockingQueue`** 的实现类**  
    - 如 `LinkedBlockingQueue`、`ArrayBlockingQueue`、`PriorityBlockingQueue` 等，用于实现生产者-消费者模型。
+ `ConcurrentSkipListSet`** 和 **`ConcurrentSkipListMap`  
    - 基于跳表实现的有序集合和映射表。
+ `DelayQueue`  
    - 特点：基于优先级队列实现的无界阻塞队列，元素只有在其延迟到期后才能被取出。
    - 适用场景：定时任务调度。

### **总结**
Java 并发集合类提供了多种线程安全的数据结构，适用于不同的并发场景。以下是一些选择建议：

+ 如果需要高并发且无序的键值对存储，选择 `ConcurrentHashMap`。
+ 如果需要有序的集合或映射表，选择 `ConcurrentSkipListSet` 或 `ConcurrentSkipListMap`。
+ 如果需要阻塞队列，选择 `LinkedBlockingQueue` 或 `ArrayBlockingQueue`。
+ 如果需要无锁的高性能队列，选择 `ConcurrentLinkedQueue`。



