Concurrent Hashmap可以解决HashMap中的同步问题。因此,如果我们使用synchronized关键字与HashMap一起使用,添加和删除将会很快。但是,如果多个线程检查ConcurrentHashMap的大小,那么检查HashMap的大小还需要同步关键字吗?如下所示:
public static synchronized getSize(){
return aConcurrentHashmap.size();
}
Concurrent Hashmap可以解决HashMap中的同步问题。因此,如果我们使用synchronized关键字与HashMap一起使用,添加和删除将会很快。但是,如果多个线程检查ConcurrentHashMap的大小,那么检查HashMap的大小还需要同步关键字吗?如下所示:
public static synchronized getSize(){
return aConcurrentHashmap.size();
}
concurentHashMap.size()
将返回调用时已知的大小,但当您使用该数字时,它可能是过时的值,因为另一个线程在此期间添加/删除了项目。
然而,ConcurrentMaps的整个目的是您不需要同步它,因为它是一个线程安全的集合。
除非您需要原子地执行多个操作,否则不需要在ConcurrentHashMap中使用synchronized,这种情况非常罕见。
如果只是获取大小,可以在没有同步的情况下调用它。
为了澄清何时会在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()
。然而,你必须记住,当你得到答案的时候,它可能已经过时了。如果另一个线程同时修改了映射,就会发生这种情况。