为什么ConcurrentHashMap不能允许key为null,而HashMap可以?
当你通过get(k)获取对应的value时,如果获取到的是null时,你无法判断,它是put(k,v)的时候value为null,还是这个key从来没有做过映射。HashMap是非并发的,可以通过contains(key)来做这个判断。而支持并发的Map在调用m.contains(key)和m.get(key)的时候,m可能已经不同了。
ConcurrentHashMap1.8是数组+链表+红黑树。加锁加在头节点,比如链表的首节点
ConcurrentHashMap1.7是分段的数组+链表,加锁是加在每个段上,段间并发,段内是无法并发的。



并发编程:理解ConcurrentHashMap与HashMap对null键的处理差异
这篇博客探讨了为何ConcurrentHashMap不允许key为null而HashMap可以的原因。主要区别在于并发安全性。在HashMap中,当key为null时,可以借助containsKey()判断是否存在映射,但在并发环境中,ConcurrentHashMap由于其内部结构和加锁机制,无法确保这种判断的准确性。ConcurrentHashMap1.8采用数组+链表+红黑树实现,加锁在链表头节点;1.7则使用分段锁,段内不可并发。这种设计确保了并发时的稳定性,但也限制了null键的使用。
4372

被折叠的 条评论
为什么被折叠?



