週末、ConcurrentHashMap、一個Bug

點擊上方☝Java編程技術樂園,輕鬆關注!

及時獲取有趣有料的技術文章

做一個積極的人
編碼、改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:看到這裏了,不要忘記給我一個贊,雖然不能暖手,但可以暖心❤️~

長按識別二維碼,關注公衆號

後臺回覆祕籍,獲取珍藏Java武學祕籍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章