众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?
一、先出源码出发

put方法点进去~

@throws NullPointerException if the specified key or value is null and this map does not permit null keys or values
可以清晰的看到源码中规定,ConcurrentHashMap是不可以存储null值的。
二、那么究竟这是为什么呢?
可以先具体的了解一下ConcurrentHashMap。
与HashMap一样,ConcurrentHashMap也是一个基于散列的Map,但它使用了一种完全不同的加锁策略来提供更高的并发性和伸缩性。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种更细的加锁机制来实现更大程度的共享,这种机制成为分段锁。在

Java的ConcurrentHashMap不支持存储null值,源于源码中的规定和并发设计考虑。ConcurrentHashMap采用分段锁策略提高并发性,其迭代器具有弱一致性,无法区分key映射到null还是未映射。作者Doug Lea认为允许null可能导致并发场景下的错误和难以检测的问题。
订阅专栏 解锁全文
1470

被折叠的 条评论
为什么被折叠?



