ConcurrentHashMap空指针异常
在某些情况下为了为了线程安全将HashMap替换为ConcurrentHashMap,但因此可能会出现NullPointerException异常。
比如当使用put方法ConcurrentHashMap中存入数据时,原来正常的业务可能会抛出NullPointerException异常。这是什么原因导致的呢?
如果通过断点跟踪会发现是在ConcurrentHashMap的put方法的此位置发生的异常。
public V put(K key, V value) { return putVal(key, value, false); } /** Implementation for put and putIfAbsent */ final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); // ... }
看完上面代码应该就明白为什么原来正常的业务因为升级Map类型之后会导致异常了,因为ConcurrentHashMap不支持key或value为null的值。
也就是说:此类虽然与 Hashtable 相似,但与HashMap不同,它不允许将null 用作键或值。
ConcurrentHashMap不使用nulls的主要原因是在并发的情况下会存在歧义。如果map.get(key)
返回是null,不能检测出是这个key创建映射的时候就是null,还是没有映射过。不是并发映射中,可以通过map.contains(key)
在检查,而在并发映射中,两次调用之间的映射可能已经更改。
ConcurrentHashmap
和Hashtable
不允许key和value为null,而HashMap
,它允许key和value为null。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接
本文链接:https://choupangxia.com/2019/12/22/concurrenthashmap-nullpointerexception/