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

31 浏览
0 Comments

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

我想要执行以下操作: \n

class A {
}
ConcurrentHashMap map = new ConcurrentHashMap<>();
public void fun() {  
     Integer count = map.get(Object);
     if (count != null) {
         map.put(Object, count+1);
     }
}
public void add() {
     // 将 Object 的计数增加 1
}
public void remove() {
     // 将 Object 的计数减少 1
}

\n如何使 fun() 方法线程安全?\n我知道一种方法是添加 synchronized 块\n

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

\n但还有其他方法吗?\n或者有没有库可以实现此功能?\n例如线程安全的 entry processor?\n


\n我还想实现以下内容: \npublic void remove() {\n int count = map.get(Object);\n count -= 5;\n if (count <= 0) {\n map.remove(Object);\n } else {\n map.put(Object, count + 2);\n }\n}\n有什么方法可以完成这个需求吗?\n谢谢。

0
0 Comments

在这段内容中,讨论了在一个条目中进行操作的线程安全问题,并提供了一些解决方法。首先,可以使用AtomicInteger类和ConcurrentHashMap.putIfAbsent()方法来解决该问题。AtomicInteger类提供了原子操作,保证了在多线程环境下的线程安全性。ConcurrentHashMap.putIfAbsent()方法可以在给定的键不存在时将键值对放入Map中,保证了在多线程环境下的线程安全性。

另外,还提到了ConcurrentHashMap.remove(key, value)方法,该方法只有在键被映射到给定值时才会移除键值对。虽然可能无法实现与问题中定义不太清楚的确切逻辑相同的操作,但是这些方法在进行类似操作时非常有用。

此外,还提供了一些可能有用的提示,如使用computeIfAbsent、computeIfPresent(或replace)以及remove(key, value)方法。并建议在ConcurrentHashMap中定义值为整数。

尽管提到了一些解决方法,但也指出了它们可能并不完美,并建议谨慎使用。

总之,在这段内容中,讨论了在一个条目中进行操作的线程安全问题,并提供了一些解决方法和提示。

0