HahMap 与 ConcurrentHashMap 对比

来源:互联网 发布:js 箭头函数作用域 编辑:程序博客网 时间:2024/05/20 06:22

概述


HashMap是基于哈希表的Map接口的非同步实现,底层是数组和链表的结合。


ConcurrentHashMap Java5中是一个支持高并发的高性能的HashMap实现,它支持完全并发的读以及一定程度并发的写。


HashMap具体实现


HashMap有3个比较重要的参数:

capacity:容量,就是数组大小
loadFactor:加载因子,用于扩容(默认0.75)
threshold:=capacity*loadFactor   最多容纳的Entry数,如果当前元素个数多于这个就要扩容(capacity扩大为原来的2倍)


它将Key_value当成一个整体--Entry对象进行处理,当需要存储一个Entry对象时,会根据hash算法来决定其在数组中的存储位置,如果那个位置有数据就插入到链表的表头,当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。


ConcurrentHashMap具体实现


ConcurrentHashMap将整个Hash表进行了分段(默认是16个segment),每个段就是一个Hashtable,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

它允许多个读操作并发进行,读操作并不需要加锁。对Hash链进行遍历不需要加锁的原因在于链指针next是final的。

有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。

对于put操作,可以一律添加到Hash链的头部。但是对于remove操作,可能需要从中间删除一个节点,这就需要将要删除节点的前面所有节点整个复制一遍,最后一个节点指向要删除结点的下一个结点。


总结

(1)ConcurrentHashMap对整个Hash表组进行了分段,而HashMap则没有
(2)ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。


参考

http://blog.csdn.net/xuefeng0707/article/details/40834595

http://blog.csdn.net/zldeng19840111/article/details/6703104

http://www.blogjava.net/qileilove/archive/2013/09/23/404308.html

http://www.iteye.com/topic/344876

0 0