Java 如何锁定单个ConcurrentHashMap对象进行修改而不阻塞整个映射?

Java 如何锁定单个ConcurrentHashMap对象进行修改而不阻塞整个映射?,java,concurrency,synchronization,nonblocking,concurrenthashmap,Java,Concurrency,Synchronization,Nonblocking,Concurrenthashmap,有没有一种简单的方法可以在修改ConcurrentHashMap对象时锁定它而不阻塞整个映射?据我所知,这里是Java8中的简单方法—方法CompetifPresent,但不幸的是,我在项目中使用了1.7Java private Map<Long, AtomicInteger> idForCountMap; public void decrement(Long id) { AtomicInteger count = idForCountMap.get(id); if

有没有一种简单的方法可以在修改ConcurrentHashMap对象时锁定它而不阻塞整个映射?据我所知,这里是Java8中的简单方法—方法CompetifPresent,但不幸的是,我在项目中使用了1.7Java

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、 假设这是一种非常常见的情况,但我找不到很好的解释性答案。

我认为,如果你能为映射值带来一个共享密钥,并为整个操作获得一个密钥锁,这将是可行的

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

锁定元素DecrementAndGet已经是一个原子操作;count.decrementAndGet;它们不是atomic@JohnKorch,正如你所写的,它实际上是原子的。如果得到一个非null的count引用,它将在递减方法的整个生命周期内有效。唯一的问题是,另一个线程可能在调用getid之后,但在检查null之前,将一个AtomicInteger放入ConcurrentHashMap,但我不认为这一定是个问题。