ConcurrentHashMap与同步HashMap

问题

使用包装类SynchronizedMap在aHashMapConcurrentHashMap之间有什么区别?它只是能够修改HashMap,同时迭代它(ConcurrentHashMap)?


#1 热门回答(83 赞)

简短的回答:

两个映射都是Map接口的线程安全实现.ConcurrentHashMap是为了在需要高并发性的情况下实现更高的吞吐量而实现的。

Brian Goetz的4215443284背后的想法非常好读。强烈推荐。


#2 热门回答(80 赞)

SynchronizedHashMap

  • 使用对象级锁定同步每个方法。因此,synchMap上的get和put方法获得了一个锁。
  • 锁定整个集合是一种性能开销。当一个线程持有锁时,没有其他线程可以使用该集合。

ConcurrentHashMap在JDK 5中引入。

  • 对象级别没有锁定,锁定的粒度更精细。对于ConcurrentHashMap,锁可能位于散列映射桶级别。
  • 较低级别锁定的作用是你可以拥有并发读取器和编写器,这对于同步集合是不可能的。这导致更多的可伸缩性。
  • 如果一个线程试图修改它而另一个线程迭代它,则ConcurrentHashMap不会抛出ConcurrentModificationException。

这篇文章Java 7: HashMap vs ConcurrentHashMap是一篇非常好的读物。强烈推荐。


#3 热门回答(27 赞)

ConcurrentHashMap是线程安全的,没有同步整个 Map 。使用锁完成写操作时,读操作可以非常快。