线程安全操作在一个条目中

时间:2016-10-19 05:28:59

标签: java multithreading concurrency java.util.concurrent concurrenthashmap

我想做像

这样的操作
class A {
}

ConcurrentHashMap<A, Integer> map = new ConcurrentHashMap<>();

public void fun() {  
     Integer count = map.get(Object);
     if (count != null) {
         map.put(Object, count+1);
     }
}
public void add() {
     // increase Object count by 1
}
public void remove() {
     // deduct Object count by 1
}

如何使fun()线程安全?

我知道一种方法是添加同步块

public void fun() {  
    synchronized("") {
        Integer count = map.get(Object);
        if (count != null) {
            map.put(Object, count+1);
        }
    }
}

但还有其他方法吗? 或者有任何图书馆可以做到吗?

像线程安全入口处理器一样?

我也希望实现像

这样的东西
public void remove() {
     int count = map.get(Object);
     count -= 5;
     if (count <= 0) {
         map.remove(Object);
     } else {
         map.put(Object, count + 2);
     }
}

Any ways to do this  ? 
Thank you

1 个答案:

答案 0 :(得分:-1)

使用AtomicIntegerConcurrentHashMap.putIfAbsent()

另外看看 ConcurrentHashMap.remove(key, value) - 仅在将密钥映射到给定值时才删除密钥。

我不确定,是否可以实现确切的逻辑(在上面的问题中没有很好地定义),但这些方法在做类似事情时非常有用。

更多提示(可能有用或可能不是太多):

你(可能!)可以使用方法:computeIfAbsent,computeIfPresent(或replace)和remove(key,value)。 可以在值为Integers的情况下定义ConcurrentHashMap。

这将是一个非常肮脏的解决方案,我不建议你使用它,但作为一个值得考虑的事情,它可能非常具有挑战性。

如果您需要更多提示,请告诉我。