周末、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 用作键或值。

那就意味着:ConcurrentHashmapHashtable都是支持并发的,二者规定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。
ConcurrentHashmapHashtable不允许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)
上一篇 2022年2月28日 下午8:00
下一篇 2022年2月28日 下午8:00


相关推荐

  • Bat实现微信多开

    Bat实现微信多开Bat 实现程序 微信 多开将鼠标放到软件快捷方式上右击 打开属性选项卡 找到目标并复制 如图 新建文本文档 并将后缀名改为 bat 复制以下代码 并保存 只需将 D Software Tencent WeChat WeChat exe 改为目标路径即可 echooffstart Software Tencent WeChat WeChat exestartD Software Tencent WeChat WeChat exepause 我的文件 echooff

    2026年3月19日
    7
  • supervisor学习记录

    supervisor学习记录1 supervisor 简介 Supervisor 是用 Python 开发的一个 client server 服务 是 Linux Unix 系统下的一个进程管理工具 不支持 Windows 系统 它可以很方便的监听 启动 停止 重启一个或多个进程 用 Supervisor 管理的进程 当一个进程意外被杀死 supervisort 监听到进程死后 会自动将它重新拉起 很方便的做到进程自动恢复的功能 不再需要自己写 s

    2026年3月16日
    2
  • DeepSeek在Mac上本地可视化部署,保姆级教程,再也不怕崩了!

    DeepSeek在Mac上本地可视化部署,保姆级教程,再也不怕崩了!

    2026年3月16日
    3
  • JavaScript控制台打印单词

    JavaScript控制台打印单词在线工具我们打开这个在线工具 进行使用 console 控制台打印字母使用方法 1 首先我们访问上面的在线工具网站 2 我们在文本框输入一些内容 比如说 Tencent 然后我们点击 TestAll 按钮 记住要点击 TestAll 按钮才会出现很多可以提供选择的样式 3 我们点击 Select amp Copy 按钮 然后按下 ctrl v 进行复制 4 最关键的一步 我们把它粘贴到 word 上 使用查找替换功能把所有的 换成 因为有转义字符的说法 5 把替换好的文本粘贴到代码上

    2026年3月26日
    2
  • 智谱AI发布GLM-5:代码能力对标Claude Opus,国产芯片加持

    智谱AI发布GLM-5:代码能力对标Claude Opus,国产芯片加持

    2026年3月12日
    1
  • 寄存器英文全称中文翻译英文对照表

    寄存器英文全称中文翻译英文对照表AH amp AL AX accumulator 累加寄存器 BH amp BL BX base 基址寄存器 CH amp CL CX count 计数寄存器 DH amp DL DX data 数据寄存器 SP StackPointer 堆栈指针寄存器 BP BasePointer 基址指针寄存器 SI SourceIndex 源变址寄存器 DI DestinationI 目的变址寄存器 IP InstructionP 指令指针寄存器 CS CodeSeg

    2026年3月19日
    2

发表回复

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

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