【Java面试】ConcurrentHashMap的key为什么不允许为null?

简介: 【Java面试】ConcurrentHashMap的key为什么不允许为null?

首先看到这个问题,肯定先打开源码看一眼

可以发现调用putVal的时候如果key或者value为null,那么就会抛出一个空指针异常

但是,为什么不允许使用null呢?

答案是:为了避免在多线程环境下出现歧义问题。

所谓的歧义问题就是:我们再调用get方法获取对应的value的时候,如果返回的结果是null,我们是没有办法判断它是put(k,v)的时候v本身是null,还是这个key本身就不存在。

比如如下情况:

如果Thread1线程先执行containsKey方法,那么由于这个key不存在,那么就会返回false,而如果是Thread2先执行put方法,那么Thread1再次执行containsKey就会返回true,那么此时返回的结果就根据两个线程的执行顺序决定了,就会产生歧义,这就算一个线程安全问题,而ConcurrenrtHashMap要求线程安全,而对于HashMap就不需要关心这一点,因为它本身就没有考虑线程安全这一设计。

答案:

ConcurrentHashMap这么设计的原因是为了避免再多线程并发这一场景下出现歧义问题。也就是说在一个线程试图去ConcurrentHashMap中获取key的情况下,如果返回的结果是null,那么不能判断是由于这个key本身不存在导致的null,或者说是value的值本身就是null这一歧义问题。那么这种情况就会导致线程安全问题,而ConcurrentHashMap它本身就是一个基于线程安全设计的集合,所以才会这么设计,不允许null键值。


相关文章
|
3天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
13 0
|
3天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
6 0
|
5天前
|
Java
三个可能的Java面试题
Java垃圾回收机制自动管理内存,回收无引用对象的内存,确保内存有效利用。多态性允许父类引用操作不同子类对象,如Animal引用可调用Dog的方法。异常处理机制通过try-catch块捕获和处理程序异常,例如尝试执行可能导致ArithmeticException的代码,catch块则负责处理异常。
28 9
|
12天前
|
Java 测试技术 Maven
Spring Boot单元测试报错java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]
Spring Boot单元测试报错java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]
|
12天前
|
Java
java Map删除值为null的元素
java Map删除值为null的元素
|
12天前
|
存储 安全 Java
【亮剑】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能
【4月更文挑战第30天】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能。数据被分割成多个Segment,每个拥有独立锁,允许多线程并发访问不同Segment。当写操作发生时,计算键的哈希值定位Segment并获取其锁;读操作通常无需锁定。内部会根据负载动态调整Segment,减少锁竞争。虽然使用不公平锁,但Java 8及以上版本提供了公平锁选项。理解其工作原理对开发高性能并发应用至关重要。
|
12天前
|
存储 Java 索引
【亮剑】Java中的并发容器ConcurrentHashMap,它在JDK1.5中引入,用于替换HashTable和SynchronizedMap
【4月更文挑战第30天】本文介绍了Java中的并发容器ConcurrentHashMap,它在JDK1.5中引入,用于替换HashTable和SynchronizedMap。文章展示了创建、添加、获取、删除和遍历元素的基本用法。ConcurrentHashMap的内部实现基于分段锁,每个段是一个独立的Hash表,通过分段锁实现并发控制。每个段内部采用数组+链表/红黑树的数据结构,当冲突过多时转为红黑树优化查询。此外,它有扩容机制,当元素超过阈值时,会逐段扩容并翻倍Segment数量,以保持高性能的并发访问。
|
15天前
|
存储 安全 Java
【JAVA】concurrentHashMap和HashTable有什么区别
【JAVA】concurrentHashMap和HashTable有什么区别
|
15天前
|
安全 Java
【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁
【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁
|
16天前
|
Java
【JAVA面试题】static的作用是什么?详细介绍
【JAVA面试题】static的作用是什么?详细介绍