问题
使用包装类SynchronizedMap
在aHashMap
和ConcurrentHashMap
之间有什么区别?它只是能够修改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 。使用锁完成写操作时,读操作可以非常快。