周末、ConcurrentHashMap、一个Bug

2022-07-20 09:17:54 浏览数 (1)

大家好,又见面了,我是全栈君。

做一个积极的人 编码、改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 用作键或值。

那就意味着: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)在检查,而在并发映射中,两次调用之间的映射可能已经更改。

总结

好了就到这里了,要开始总结了。不会总结太多,因为人们总是喜欢遗忘。请在遗忘之前记住这下面这一段,能够避免我今天的这个bug。 ConcurrentHashmapHashtable不允许key和value为null,而HashMap ,它允许key和value为null。

如果你记忆力好的话,记住上面的这一句之后,还能记住上面的分析,为什么这样设计,那就更好了。

今天写了这个小bug,还真是有点丢人(我真的太水了,这都不会~),但是从这个bug里面也学习到了: 1、基础的知识点要夯实; 2、出现问题(写了bug),在找到解决方案后,最好能分析下问题的原因是什么

希望你看完本篇能够有所收获,我是一个流浪的杀手,祝你周末愉快~

PS:看到这里了,不要忘记给我一个赞,虽然不能暖手,但可以暖心❤️~

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120986.html原文链接:https://javaforall.cn

0 人点赞