一句话定位除了 ConcurrentHashMapJUC 还提供了一整套线程安全容器各有适用场景。1. 为什么不用 Collections.synchronizedXxxListStringlistCollections.synchronizedList(newArrayList());本质是给每个方法加synchronized整个容器一把锁并发度1。复合操作仍不安全遍历时要手动加锁。性能差JUC 容器是更好的选择。2. CopyOnWriteArrayList写时复制核心思想读不加锁写的时候复制一份新数组改改完替换引用。CopyOnWriteArrayListStringlistnewCopyOnWriteArrayList();// add 源码精髓publicbooleanadd(Ee){synchronized(lock){// 写加锁Object[]oldgetArray();Object[]newArrArrays.copyOf(old,old.length1);// 复制新数组newArr[old.length]e;setArray(newArr);// volatile 替换引用returntrue;}}publicEget(intindex){return(E)getArray()[index];// 读完全不加锁}优点缺点读无锁读性能极高写要复制整个数组内存性能开销大遍历时不抛 ConcurrentModificationException数据弱一致读可能读到旧快照适用读多写极少、数据量不大。典型监听器列表、配置白名单、路由表。不适用频繁写、大数据量每次写都复制OOM 风险。3. CopyOnWriteArraySet基于 CopyOnWriteArrayList 实现的 Set特性相同适合读多写少的集合去重场景。4. ConcurrentLinkedQueue无锁队列基于CAS的无界非阻塞队列不是阻塞队列ConcurrentLinkedQueueTaskqueuenewConcurrentLinkedQueue();queue.offer(task);// 入队CAS不阻塞Tasktqueue.poll();// 出队空返回 null不阻塞高并发下性能好无锁 CAS。空时poll返回 null不阻塞和 BlockingQueue 的 take 不同。size()要遍历是 O(n)别频繁调用。适用高并发、不需要阻塞等待的队列场景。需要阻塞用 BlockingQueue见 12 篇。5. ConcurrentSkipListMap / Set并发有序容器跳表SkipList实现的并发有序Map/Set相当于并发版的 TreeMap。ConcurrentSkipListMapInteger,StringmapnewConcurrentSkipListMap();map.put(3,c);map.put(1,a);map.put(2,b);// 自动按 key 排序支持范围查询map.firstKey();// 1map.headMap(2);// 小于 2 的部分map.ceilingKey(2);// 2 的最小 key跳表结构多层索引链表查询 O(log n) L2: 1 ────────────→ 9 L1: 1 ──→ 4 ──────→ 9 L0: 1 → 3 → 4 → 6 → 9 (底层完整链表)TreeMapConcurrentSkipListMap线程安全❌✅实现红黑树跳表有序✅✅适用需要并发 有序 范围查询。比如排行榜、按时间排序的事件表。6. 容器选型速查需求推荐容器并发 MapConcurrentHashMap并发有序 MapConcurrentSkipListMap读多写极少的 ListCopyOnWriteArrayList高并发非阻塞队列ConcurrentLinkedQueue需要阻塞的队列生产消费BlockingQueue见 12 篇并发 SetConcurrentHashMap.newKeySet()读多写少的 SetCopyOnWriteArraySet7. 踩坑与最佳实践⚠️ CopyOnWrite 系列写代价大只用于读多写极少、数据量小的场景否则 OOM。⚠️ CopyOnWrite 读的是快照弱一致刚写的可能读不到别用于强一致场景。⚠️ConcurrentLinkedQueue.size()是 O(n)判空用isEmpty()不要用size()0。✅ 需要并发 Set 用ConcurrentHashMap.newKeySet()比 CopyOnWriteArraySet 更通用。✅ 别用Collections.synchronizedXxxJUC 容器性能更好。 遍历 CopyOnWriteArrayList 时其他线程的修改不影响当前遍历基于快照不会抛并发修改异常。8. 本篇小结CopyOnWriteArrayList写时复制读无锁适合读多写极少。ConcurrentLinkedQueueCAS 无锁队列不阻塞。ConcurrentSkipListMap跳表实现的并发有序 Map。按“是否有序、是否阻塞、读写比例”选择合适容器。
阅读完成 · 觉得有帮助?