周末、ConcurrentHashMap、一个Bug

做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!真正的努力,从来都不是埋头苦干,还要时不时的偷偷懒周末周末了,有一段时间没用周末加班了。今天下午在家了加了会班,写了一会代码,因为下周要请一天假,而我手头的工作还有一些没有搞定,只能抽点时间赶赶进度。我所在的城市今天下着小雨,天气变得冷了起来。坐在电脑前,开着暖风机,不至于让敲代码的冻着(…

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

做一个积极的人
编码、改bug、提升自己

我有一个乐园,面向编程,春暖花开!

周末、ConcurrentHashMap、一个Bug

真正的努力,从来都不是埋头苦干,还要时不时的偷偷懒

周末

周末了,有一段时间没用周末加班了。今天下午在家了加了会班,写了一会代码,因为下周要请一天假,而我手头的工作还有一些没有搞定,只能抽点时间赶赶进度。

我所在的城市今天下着小雨,天气变得冷了起来。坐在电脑前,开着暖风机,不至于让敲代码的冻着(唉 ,真的冻手但是还没到要开空调,忍忍~)。

写代码的时候,在调试的遇到了一个问题,真的很小的一个问题(就如标题所写的问题),但是我还是想写一下,顺便扯扯淡。最近也好久没用写东西了,原因有二:
一个是XX
一个是YY

有时候特羡慕莎士比亚,羡慕他的天份,能够写出了人世的喜怒哀乐。而我想写一些和代码的“悲欢离合”,也苦于没有半点天份,不能实现。

ConcurrentHashMap、一个Bug

扯远了,今天的主题不是周末,而是主题:ConcurrentHashMap、一个Bug

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

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

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

周末、ConcurrentHashMap、一个Bug我的bug啊.png

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

周末、ConcurrentHashMap、一个BugConcurrentHashMap 介绍.png

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

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

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

周末、ConcurrentHashMap、一个Bug

看了英文,大致理解:

不使用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:看到这里了,不要忘记给我一个赞,虽然不能暖手,但可以暖心❤️~

 

 

 Java编程技术乐园:一个分享干货编程技术知识的公众号。

周末、ConcurrentHashMap、一个Bug

后台回复【秘籍】,获取珍藏Java武学秘籍

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是 Hook 技术

    什么是 Hook 技术一、什么是Hook技术  Hook技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。  要实现钩子函数,有两个步骤:  1.利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)  2.动态代理(使用所有场景)二、Hook技术实现的步骤  Hook技术实现的步骤也分为两步  1.找到ho

    2022年5月13日
  • 软件测试常见面试题

    软件测试常见面试题伴随着疫情的好转,又到了一年收获的季节。最近也有一些面试,整理下常用的测试题目,没有标准答案,需要结合自身的工作实践去应答。功能测试相关1、测试流程以及对应阶段的输出有哪些?2、Bug的优先级

    2022年8月6日
  • mac系统webstorm快捷键

    mac系统webstorm快捷键WebStorm是jetbrains公司旗下一款JavaScript开发工具。被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaSscriptIDE”等。与IntelliJIDEA同源,继承了IntelliJIDEA强大的JS部分的功能.现将最常用的快捷键挑出来备忘,既能方便记忆,又能提高工作效率。快捷键作用…

    2022年5月23日
  • java实现靠边隐藏窗口

    java实现靠边隐藏窗口

    2022年2月23日
  • idea202112激活码永久【在线注册码/序列号/破解码】

    idea202112激活码永久【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
  • 如何简便的解决虚拟机里软件过期问题「建议收藏」

    如何简便的解决虚拟机里软件过期问题「建议收藏」如果你的虚拟机里安装了有期限软件供学习使用,在过期后只能先修改其宿主机操作系统的系统时间才能使用,很不方便。如何简便的解决此过期问题呢?   感谢网友的分享,找到通过修改VMWare虚拟机配置参数的方式,固化每次启动虚拟机时间为国定时间,并禁止其与互联网同步时间,让虚拟机系统一直生活在2014年3月份。具体方法如下:   如果你在vmware(本案例为VMWarePlayer6

    2022年9月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号