如何在不阻塞整个映射的情况下锁定单个ConcurrentHashMap对象进行修改?

时间:2017-06-02 11:10:47

标签: java concurrency synchronization nonblocking concurrenthashmap

在修改过程中是否有一种简单的方法可以锁定ConcurrentHashMap对象而不会阻塞整个地图?据我所知,这里是Java 8中的简单方法 - 方法 competitionIfPresent ,但不幸的是我在项目上有1.7个java。

private Map<Long, AtomicInteger> idForCountMap;

public void decrement(Long id) {
    AtomicInteger count = idForCountMap.get(id);
    if (count != null){
    count.decrementAndGet();
    // do some additional operations
    }
}

这是一个例子。如何在不阻塞整个地图的情况下执行递减操作作为原子操作?

P.S。假设这是很常见的情况,但我找不到很好的解释答案。

1 个答案:

答案 0 :(得分:1)

我认为如果您可以为映射值带来共享密钥,并获取完整操作的密钥锁定,它将会运行。

public void decrement(SharedKey id) {
synchronized(id){
     AtomicInteger count = idForCountMap.get(id);
     if (count != null){
        count.decrementAndGet();
        // do some additional operations
     }
}
}