點擊上方☝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 用作鍵或值。
那就意味着: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:看到這裏了,不要忘記給我一個贊,雖然不能暖手,但可以暖心❤️~
長按識別二維碼,關注公衆號
後臺回覆【祕籍】,獲取珍藏Java武學祕籍