ConcurrentHashMap如何在内部工作?
我正在阅读关于Java中的并发性的官方Oracle文档,我想知道返回的Collection
之间可能有什么区别
public static <T> Collection<T> synchronizedCollection(Collection<T> c);
并使用例如a
ConcurrentHashMap
。 我假设我在HashMap
上使用synchronizedCollection(Collection<T> c)
。 我知道通常一个同步集合本质上只是我的HashMap
一个装饰器,所以很明显ConcurrentHashMap
在其内部有不同的东西。 你有关于这些实施细节的一些信息吗?
编辑:我意识到源代码是公开的: ConcurrentHashMap.java
我会阅读ConcurrentHashMap的源代码,因为它在细节上相当复杂。 总之它有
ConcurrentHashMap
与java.util.HashTable
类非常相似,只不过ConcurrentHashMap
比HashTable
或synchronizedMap
提供更好的并发性。 ConcurrentHashMap
在您读取时不锁定地图。 此外,在写入时, ConcurrentHashMap
不会锁定整个Map
。 它只在内部锁定正在写入的Map
部分。
另一个区别是,如果ConcurrentHashMap
在迭代过程中发生更改,则ConcurrentHashMap不会抛出ConcurrentModificationException
。 Iterator
不能被多个线程使用,而synchronizedMap
可能会抛出ConcurrentModificationException
这是帮助我理解它的文章为什么ConcurrentHashMap比Hashtable更好,并且和HashMap一样好
哈希表的报价并发访问他们的条目,有一个小警告,整个地图被锁定执行任何类型的操作。 虽然这种开销在正常负载下的Web应用程序中是可以忽略的,但在负载较重的情况下,它可能导致响应时间延迟并导致服务器负担过重,原因不明。
这就是ConcurrentHashMap步入的地方。它们提供了与HashMap几乎一样好的Hashtable的所有功能。 ConcurrentHashMap通过一个非常简单的机制来完成这个任务。 该集合不是一个全地图锁,而是默认维护一个16个锁的列表,每个锁都用于保护(或锁定)地图的一个桶。 这实际上意味着16个线程可以一次修改集合(只要它们都在不同的桶上工作)。 事实上,这个集合没有执行操作来锁定整个地图。 可以增加集合的并发级别,可以同时修改而不会阻塞的线程数量。 然而,更高的数字意味着更多的开销来维护这个锁列表。
链接地址: http://www.djcxy.com/p/66513.html