Hashmap/Hashtable/ConcurentHashmap/synchronizedMap
2014-03-24 00:00
411 查看
摘要: 见到有人被问到,特意百度整理记忆
Hashtable提供了一种易于使用的、线程安全的、关联的map功能。 然而,线程安全性是凭代价换来的——Hashtable的所有方法都是同步的。synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费。
HashMap提供一个不同步的基类和一个同步的包装器Collections.synchronizedMap(对应List和Collections.synchronizedList,更安全使用CopyOnWriteArrayList),解决了线程安全性问题。 通过将基本的功能从线程安全性中分离开来,Collections.synchronizedMap是有条件地线程安全——所有单个的操作都是线程安全的,但是多个操作组成的操作序列却可能导致数据争用,因为在操作序列中控制流取决于前面操作的结果。允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。
左边便是Hashtable的实现方式---锁整个hash表;而右边则是ConcurrentHashMap的实现方式---锁桶(或段)。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。原来只能一个线程进入,现在却能同时16个写线程进入,并发性的提升是显而易见的。并且ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作。
参考:
http://blog.sina.com.cn/s/blog_5157093c0100hm3y.html
http://www.blogjava.net/zlsunnan/archive/2006/07/02/56184.html
Hashtable提供了一种易于使用的、线程安全的、关联的map功能。 然而,线程安全性是凭代价换来的——Hashtable的所有方法都是同步的。synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费。
HashMap提供一个不同步的基类和一个同步的包装器Collections.synchronizedMap(对应List和Collections.synchronizedList,更安全使用CopyOnWriteArrayList),解决了线程安全性问题。 通过将基本的功能从线程安全性中分离开来,Collections.synchronizedMap是有条件地线程安全——所有单个的操作都是线程安全的,但是多个操作组成的操作序列却可能导致数据争用,因为在操作序列中控制流取决于前面操作的结果。允许需要同步的用户可以拥有同步,而不需要同步的用户则不必为同步付出代价。
ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。
左边便是Hashtable的实现方式---锁整个hash表;而右边则是ConcurrentHashMap的实现方式---锁桶(或段)。 ConcurrentHashMap将hash表分为16个桶(默认值),诸如get,put,remove等常用操作只锁当前需要用到的桶。原来只能一个线程进入,现在却能同时16个写线程进入,并发性的提升是显而易见的。并且ConcurrentHashMap的读取并发,因为在读取的大多数时候都没有用到锁定,所以读取操作几乎是完全的并发操作。
参考:
http://blog.sina.com.cn/s/blog_5157093c0100hm3y.html
http://www.blogjava.net/zlsunnan/archive/2006/07/02/56184.html
相关文章推荐
- HashMap source code analyze/ Hashmap/Hashtable/ConcurentHashmap/synchronizedMap
- ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
- Difference between ConcurrentHashMap and Collections.synchronizedMap and Hashtable in Java
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
- ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
- ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
- Hashtable 和 HashMap和concurrentHashMap和collections.synchronizedMap
- 测试 hashmap hashtable Collections.synchronizedMap 多线程并发安全
- HashMap、 HashTable 、Collections.synchronizedMap、 ConcurrentHashMap
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别(二)
- Hashtable, HashMap, Collections.synchronizedMap, ConcurrentHashMap 多线程并发特行分析
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
- HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别
- HashMap,HashTable,synchronizedMap,ConcurrentHashMap,TreeMap,IdentityHashMap的比较分析
- ConcurrentHashMap vs Collections.synchronizedMap()不同
- HashMap,HashTable,LinkedMap,TreeMap
- Java中List,ArrayList、Vector,map,HashTable,HashMap区别用法
- stl hashmap与map hashmap与hashtable
- 关于hashmap和hashtable的区别,及如何使hashmap变得线程安全?(除了synchronized)---concurrentHashmap
- HashMap,Hashtable,SynchronizedHashMap,ConcurrentHashMap