原博客地址http://javarevisited.blogspot.sg/2011/04/difference-between-concurrenthashmap.html
转载请注明出处:http://blog.csdn.net/neuxq/article/details/55008235
ConcurrentHashMap vs Hashtable vs Synchronized HashMap
尽管这三个类都能用于多线程,但是其中有一个明显的不同,那就是它们如何实现线程安全。HashTable是从JDK 1.1开始就是存在的标准类,它使用Synchronized方法实现线程安全。所有的HashTable的方法都是同步的,但是同时如果一个线程使用HashTable,其他线程必须等待。Synchronized HashMap与HashTable没有明显的不同,都是提供了显示的方法实现同步,唯一的不同是后者不是标准的Java类,你可通过Collections.synchronizedMap()方法任意包装HashMap。
另一方面,ConcurrentHashMap是专门为了同步设计的,它默认是可以允许十六个线程同时读写而不需要额外的同步。它也是可扩展的,因为它在类的内部使用了跳跃锁技术。不像hashtable和Synchronized HashMap,它从不将整个Map锁住,相反的是,它将Map分成几个部分,由多个锁管理。因此当读操作多与写操作时,ConcurrentHashMap能表现出很好的性能。
老实说,集合类是Java API 的心脏,因此我觉得明智的使用它们是一门艺术。在我的私人经历中就存在很多这样的情况:例如,在某种情况下使用ArrayListde 的应用性能比Vector好。在Java 5之前,Java 集合框架主要的缺点就是缺乏可扩展性。
在多线程Java应用中,同步的集合类,如HashTable和Vector等成为一个扬中的瓶颈。为了处理可扩展性,JDK 1.5 提出了一些好的并发集合,用来适应高容量,低延时系统的数据转换。
在这里,本文将介绍ConcurrentHashMap,HashTable和Synchronized HashMap的不同之处。
为什么需要ConcurrentHashMap和CopyOnWriteArrayList
同步集合类:Hashtable, Vector, 以及 同步类方法 Collections.synchronizedMap() 和 Collections.synchronizedList()提供了Map和List的基础线程安全功能。然而一些原因使它们不是在高并发的应用中,例如,单个锁结构阻止了它们的可扩展性并且这个单一锁在集合迭代时必须要长时间占有这个类的使用权以防止产生ConcurrentModificationException异常
ConcurrentHashMap and CopyOnWriteArrayList提供了更高的并发速度,同时保证线程安全性。但是当你不要考虑多线程的情况时,或许HashMap or ArrayList更加适合你。
ConcurrentHashMap and Hashtable不同之处
ConcurrentHashMap and Hashtable都用在多线程的应用环境中,但是当HashTable的容量很大时会严重影响它的性能,主要原因是在迭代过程中需要长时间持有单一锁。因为ConcurrentHashMap提出了片段的概念,即使容量很大,也会用不同的锁处理不同的部分完成同步,所以很多读取操作不会影响某一部分的写操作。
总之,ConcurrentHashMap仅仅提供Map的部分锁,而HashTable使用单一锁完。下图可以很好地解释其中原理。
ConcurrentHashMap and Collections.synchronizedMap不同之处
除了锁机制不同以外,ConcurrentHashMap不允许值为null,而synchronized HashMap允许值为null。