java并发集合类 设计思想

本文探讨了并发集合类如ConcurrentMap禁止使用null值的原因。主要在于并发环境下,无法判断map.get(key)返回null是因为键不存在还是值确实为null。这种不确定性在非并发环境中可通过map.contains(key)解决,但在并发环境中由于状态可能发生变化而变得复杂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为什么并发集合类不支持null

按照设计者Doug Lea自己的说法是:

The main reason that nulls aren't allowed in ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) is that ambiguities that may be just barely tolerable in non-concurrent maps can't be accommodated. The main one is that if map.get(key) returns null, you can't detect whether the key explicitly maps to null vs the key isn't mapped. In a non-concurrent map, you can check this via map.contains(key), but in a concurrent one, the map might have changed between calls.

在ConcurrentMap中不允许null的原因是在非并发map允许的歧义性在并发环境下是不允许的。以null值来说,在并发环境下,无法分辨map.get(key)返回null是键不存在,还是值为null。在非并发环境下,可以使用map.contains(key)来分辨,但并发环境下两次调用期间map可能发生了改变。

我也赞同Doug Lea的说法:

I personally think that allowing nulls in Maps (also Sets) is an open invitation for programs to contain errors that remain undetected until they break at just the wrong time.

在集合中允许null(键/值),本质是对程序逃避检查错误直到错误爆发的一种鼓励。

转载于:https://www.cnblogs.com/redreampt/p/9408964.html

Java 提供了丰富的并发集合类,它们旨在支持多线程环境下的高效操作。这些类位于 `java.util.concurrent` 包及其子包中,并通过内置锁、原子变量和其他同步机制确保数据的一致性和安全性。 ### 常见的 Java 并发集合类 #### 1. **ConcurrentHashMap** - 这是一个高度优化的哈希表实现,在高并发环境下性能优于传统的 `synchronized HashMap` 或 `Collections.synchronizedMap()`。 - 支持高效的读取和更新操作,允许同时进行多次只读访问以及有限次数的写入操作。 #### 2. **CopyOnWriteArrayList** - 它是一种线程安全的变长数组实现。它的核心思想是在每次修改时创建整个列表的新副本,因此适合用于读多写少的场景。 - 写操作代价较高,但读操作无需加锁,非常快。 #### 3. **CopyOnWriteArraySet** - 相当于基于 `CopyOnWriteArrayList` 实现的一个线程安全的 Set 集合,内部使用一个不可修改的 List 来存储元素。 #### 4. **BlockingQueue 接口及其实现类** - 设计目标是为了解决生产者消费者模型的问题。它提供了一个阻塞队列的功能,即在需要的时候会自动等待资源可用后再继续处理任务。 - **LinkedBlockingQueue**: 双端链式队列,默认容量无限大; - **ArrayBlockingQueue**: 固定大小的有界循环缓冲区; - **PriorityBlockingQueue**: 具备优先级顺序的支持版本(非公平排序); - **SynchronousQueue**: 没有任何内部存储空间,每一个插入动作都必须有一个移除动作相匹配; #### 5. **ConcurrentSkipListMap 和 ConcurrentSkipListSet** - 分别对应有序映射结构和无序唯一值集合的数据类型。底层采用跳表算法保证良好的查找效率的同时也具备较好的并行能力。 #### 6. **Atomic 类族** - 虽然严格来说不是“集合”,但是提供了许多针对基本类型的原子级别操作功能,比如自增等基础算术运算。 - AtomicBoolean / AtomicInteger / LongAdder 等... --- ### 使用注意事项 - 根据实际需求选择合适的容器类别非常重要。例如如果只是简单地共享状态,则考虑用简单的 atomic variables 即可减少开销; - 对于频繁改动的数据集应避免 copy-on-write 方案以免带来过高的内存负担;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值