大家好,又见面了,我是全栈君。
做一个积极的人 编码、改bug、提升自己
我有一个乐园,面向编程,春暖花开!
真正的努力,从来都不是埋头苦干,还要时不时的偷偷懒
周末
周末了,有一段时间没用周末加班了。今天下午在家了加了会班,写了一会代码,因为下周要请一天假,而我手头的工作还有一些没有搞定,只能抽点时间赶赶进度。
我所在的城市今天下着小雨,天气变得冷了起来。坐在电脑前,开着暖风机,不至于让敲代码的冻着(唉 ,真的冻手但是还没到要开空调,忍忍~)。
写代码的时候,在调试的遇到了一个问题,真的很小的一个问题(就如标题所写的问题),但是我还是想写一下,顺便扯扯淡。最近也好久没用写东西了,原因有二: 一个是XX 一个是YY
有时候特羡慕莎士比亚,羡慕他的天份,能够写出了人世的喜怒哀乐。而我想写一些和代码的“悲欢离合”,也苦于没有半点天份,不能实现。
ConcurrentHashMap、一个Bug
扯远了,今天的主题不是周末,而是主题: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)
在检查,而在并发映射中,两次调用之间的映射可能已经更改。
总结
好了就到这里了,要开始总结了。不会总结太多,因为人们总是喜欢遗忘。请在遗忘之前记住这下面这一段,能够避免我今天的这个bug。
ConcurrentHashmap
和Hashtable
不允许key和value为null,而HashMap
,它允许key和value为null。
如果你记忆力好的话,记住上面的这一句之后,还能记住上面的分析,为什么这样设计,那就更好了。
今天写了这个小bug,还真是有点丢人(我真的太水了,这都不会~),但是从这个bug里面也学习到了: 1、基础的知识点要夯实; 2、出现问题(写了bug),在找到解决方案后,最好能分析下问题的原因是什么。
希望你看完本篇能够有所收获,我是一个流浪的杀手,祝你周末愉快~
PS:看到这里了,不要忘记给我一个赞,虽然不能暖手,但可以暖心❤️~
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120986.html原文链接:https://javaforall.cn