并发HashMap:检查大小

时间:2012-04-25 10:10:29

标签: java concurrency concurrenthashmap

Concurrent Hashmap可以解决在hashmap中看到的同步问题。因此,如果我们使用hashmap同步键工作,添加和删除会很快。如果mulitple线程检查concurrentHashMap大小,那么检查hashmap大小呢?我们还需要同步关键词:如下:

public static synchronized getSize(){
     return aConcurrentHashmap.size();
}  

5 个答案:

答案 0 :(得分:9)

concurentHashMap.size()将返回调用时已知的大小,但是当您使用该数字时它可能是一个陈旧的值,因为另一个线程在此期间添加/删除了项目。

然而,ConcurrentMaps的全部目的是你不需要同步它,因为它是一个线程安全的集合。

答案 1 :(得分:2)

您只需致电aConcurrentHashmap.size()即可。但是,您必须记住,当您得到答案时,它可能已经过时了。如果另一个线程同时修改地图,就会发生这种情况。

答案 2 :(得分:1)

除非在极少数需要以原子方式执行多个操作的情况下,否则不需要使用与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());
    }
}

注意:这要求所有写入都是同步的,但读取仍然可以是并发的。

答案 3 :(得分:0)

ConcurrentHashMap的设计者考虑对单个操作赋予权重,例如:get()put()remove(),而不是像isEmpty()或{{1}那样对完整的HashMap进行操作的方法}}。这样做是因为调用这些方法的变化(通常)比其他单个方法要小。

此处不需要size()的同步。我们可以通过调用size()方法来获取大小。此方法可能返回过时值,因为其他线程可能同时修改映射。但是,这显然被认为是打破了,因为这些操作被优先考虑。

答案 4 :(得分:0)

ConcorrentHashMap是故障安全的。它不会给出任何并发的修改异常。它适用于多线程操作。 ConcurrentHashMap的整个实现与HashMap相同,但是在检索元素的同时,HashMap锁定整个映射,限制了进行进一步的修改,从而导致并发修改异常。 但是在ConcurrentHashMap中,锁定发生在存储桶级别,因此不存在提供并发修改异常的机会。

因此在这里回答您的问题,检查ConcurrentHashMap的大小没有帮助,因为,它会根据您在地图上编写的操作或修改代码保持链接。它具有与HashMap相同的size方法。