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
- HahMap 与 ConcurrentHashMap 对比
- HahMap与Hashtable的异同
- readWriteLock并发map与concurrentHashMap对比
- [JAVA学习笔记-86]ConcurrentHashMap与synchronizedMap的对比
- HashMap和ConcurrentHashMap的对比
- HashMap和ConcurrentHashMap的对比
- Java HashTable HashMap ConcurrentHashMap 对比选择
- HashMap、HashSet、Hashtable、concurrentHashmap、treemap、linkedhashmap对比
- Hashtable与ConcurrentHashMap区别
- Hashtable与ConcurrentHashMap区别
- HashMap 与 ConcurrentHashMap
- Hashtable与ConcurrentHashMap区别
- HashMap与ConcurrentHashMap
- Hashtable与ConcurrentHashMap区别
- HashMap与ConCurrentHashMap
- hashMap与ConcurrentHashmap
- Hashtable与ConcurrentHashMap区别
- Hashtable与ConcurrentHashMap区别
- 【NOIP2007】矩阵取数题解
- UE4学习笔记12th
- TCP协议详解(一)
- HDU 5294 Tricks Device 最短路+最小割
- C语言:非减链表的合并
- HahMap 与 ConcurrentHashMap 对比
- HDU 2191 多重背包问题
- leetCode 105.Construct Binary Tree from Preorder and Inorder Traversal (根据前序遍历和中序遍历构造二叉树)
- DEX 方法超过64K限制和gradle编译OOM问题解决
- acm-uva10653解题报告
- cygwin不能执行make
- 设计模式之Factory----经典
- IOS中Json解析的四种方法
- leetCode 106.Construct Binary Tree from Inorder and Postorder Traversal (根据中序遍历和后序遍历构造二叉树)