重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这篇文章主要介绍“怎么排查ConcurrentHashMap源码”,在日常操作中,相信很多人在怎么排查ConcurrentHashMap源码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么排查ConcurrentHashMap源码”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
创新互联建站长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为泸溪企业提供专业的成都网站建设、成都做网站,泸溪网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
主题:ConcurrentHashMap、一个Bug
我在写业务代码的时候,之前用HashMap
存点东西,但是可能存在并发操作,我就换了一个高端一点的ConcurrentHashMap
,然后在调试的时候出现了NullPointerException
异常。
于是一个我debug了一下,发现一个null
的数据存进去后,代码就给我抛了这个异常。真的是高端了,我是使用HashMap
存没有问题,这个就不行了。
于是排查ConcurrentHashMap
源码,发现了在put
的时候有下面这一行代码,这不就很清晰了麽,不用在费话了。
我的bug啊.png
但是我不能到这里就Stop了。于是我又去查了ConcurrentHashMap
API,如下:
ConcurrentHashMap 介绍.png
其他的大篇幅内容不做介绍,注意这句:此类与 Hashtable 相似,但与 HashMap 不同,它不 允许将 null 用作键或值。
那就意味着:ConcurrentHashmap
和Hashtable
都是支持并发的,二者规定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源码”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!