我想做像
这样的操作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
答案 0 :(得分:-1)
使用AtomicInteger和ConcurrentHashMap.putIfAbsent()
另外看看 ConcurrentHashMap.remove(key, value) - 仅在将密钥映射到给定值时才删除密钥。
我不确定,是否可以实现确切的逻辑(在上面的问题中没有很好地定义),但这些方法在做类似事情时非常有用。
更多提示(可能有用或可能不是太多):
你(可能!)可以使用方法:computeIfAbsent,computeIfPresent(或replace)和remove(key,value)。 可以在值为Integers的情况下定义ConcurrentHashMap。
这将是一个非常肮脏的解决方案,我不建议你使用它,但作为一个值得考虑的事情,它可能非常具有挑战性。
如果您需要更多提示,请告诉我。