千家信息网

怎么排查ConcurrentHashMap源码

发表于:2025-01-27 作者:千家信息网编辑
千家信息网最后更新 2025年01月27日,这篇文章主要介绍"怎么排查ConcurrentHashMap源码",在日常操作中,相信很多人在怎么排查ConcurrentHashMap源码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法
千家信息网最后更新 2025年01月27日怎么排查ConcurrentHashMap源码

这篇文章主要介绍"怎么排查ConcurrentHashMap源码",在日常操作中,相信很多人在怎么排查ConcurrentHashMap源码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么排查ConcurrentHashMap源码"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

ConcurrentHashMap、一个Bug

主题:ConcurrentHashMap、一个Bug

我在写业务代码的时候,之前用HashMap存点东西,但是可能存在并发操作,我就换了一个高端一点的ConcurrentHashMap,然后在调试的时候出现了NullPointerException 异常。

于是一个我debug了一下,发现一个null的数据存进去后,代码就给我抛了这个异常。真的是高端了,我是使用HashMap存没有问题,这个就不行了。

于是排查ConcurrentHashMap源码,发现了在put的时候有下面这一行代码,这不就很清晰了麽,不用在费话了。

我的bug啊.png

但是我不能到这里就Stop了。于是我又去查了ConcurrentHashMap API,如下:

ConcurrentHashMap 介绍.png

其他的大篇幅内容不做介绍,注意这句:此类与 Hashtable 相似,但与 HashMap 不同,它不 允许将 null 用作键或值。

那就意味着:ConcurrentHashmapHashtable都是支持并发的,二者规定key,value均不能为null,null的话,会抛出空指针异常。又看了一下HashMap ,它允许key和value为null。

知道这个了,那为什么要这样设计呢?查资料看到,stackoverflow:
why-does-concurrenthashmap-prevent-null-keys-and-values

看了英文,大致理解:

不使用nulls的主要原因是在并发的情况下会存在歧义。如果map.get(key)返回是null,不能检测出是这个key创建映射的时候就是null,还是没有映射过。不是并发映射中,可以通过map.contains(key)在检查,而在并发映射中,两次调用之间的映射可能已经更改。

到此,关于"怎么排查ConcurrentHashMap源码"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0