Concurrent Hashmap 可以解决在 hashmap 中出现的同步问题。因此,如果我们使用带 hashmap 的同步键工作,添加和删除会很快。如果有多个线程检查 concurrentHashMap 大小,那么检查 hashmap 大小呢?是否还需要同步关键字:如下:
public static synchronized getSize(){
return aConcurrentHashmap.size();
}
Concurrent Hashmap 可以解决在 hashmap 中出现的同步问题。因此,如果我们使用带 hashmap 的同步键工作,添加和删除会很快。如果有多个线程检查 concurrentHashMap 大小,那么检查 hashmap 大小呢?是否还需要同步关键字:如下:
public static synchronized getSize(){
return aConcurrentHashmap.size();
}
concurentHashMap.size()
将返回调用时已知的大小,但是当您使用该数字时它可能是一个陈旧的值,因为同时另一个线程已经添加/删除了项目。
然而 ConcurrentMaps 的全部目的是你不需要同步它,因为它是一个线程安全的集合。
您不需要将同步与 ConcurretnHashMap 一起使用,除非在极少数情况下您需要原子地执行多个操作。
要获得大小,您可以在不同步的情况下调用它。
为了澄清我何时将使用与 ConcurrentHashMap 同步...
假设您有一个要按需创建的昂贵对象。您需要并发读取,但也希望确保值只创建一次。
public ExpensiveObject get(String key) {
return map.get(key); // can work concurrently.
}
public void put(String key, ExepensiveBuilder builder) {
// cannot use putIfAbsent because it needs the object before checking.
synchronized(map) {
if (!map.containsKey(key))
map.put(key, builder.create());
}
}
注意:这要求所有的写入都是同步的,但读取仍然可以是并发的。
您可以简单地调用aConcurrentHashmap.size()
. 但是,您必须记住,当您得到答案时,它可能已经过时了。如果另一个线程同时修改地图,就会发生这种情况。
ConcurrentHashMap 的设计者考虑赋予单独的操作权重,例如 : get()
,put()
以及remove()
在整个 HashMap 上操作的方法,例如isEmpty()
or size()
。这样做是因为(通常)调用这些方法的更改少于其他单个方法。
size()
这里不需要同步。我们可以通过调用concurentHashMap.size()
方法来获取大小。此方法可能会返回过时的值,因为其他线程可能会同时修改映射。但是,由于这些操作的优先级被取消,这被明确地假定为被打破。
ConcorrentHashMap 是故障安全的。它不会给出任何并发修改异常。它适用于多线程操作。ConcurrentHashMap 的整个实现与 HashMap 相同,但在检索元素时,HashMap 会锁定整个映射,限制进行进一步修改,从而导致并发修改异常。但是在 ConcurrentHashMap 中,锁定发生在存储桶级别,因此不存在并发修改异常的机会。
因此,要在这里回答您的问题,检查 ConcurrentHashMap 的大小并没有帮助,因为它会根据您在地图上编写的操作或修改代码保持链接。它具有与 HashMap 相同的 size 方法。