我想要定期遍历一个 ConcurrentHashMap
并删除其中的条目,类似于以下代码:
for (Iterator<Entry<Integer, Integer>> iter = map.entrySet().iterator(); iter.hasNext(); ) {
Entry<Integer, Integer> entry = iter.next();
// do something
iter.remove();
}
问题在于在我迭代时,另一个线程可能会更新或修改值。如果发生这种情况,那些更新可能会永久丢失,因为当我迭代时,我的线程只看到过期的值,但是 remove()
将删除活动条目。
经过一些考虑,我想出了以下解决方法:
map.forEach((key, value) -> {
// delete if value is up to date, otherwise leave for next round
if (map.remove(key, value)) {
// do something
}
});
这种方法的一个问题是它无法捕获对可变值的修改,如果这些可变值没有实现equals()
方法(比如AtomicInteger
),则会出现问题。有没有更好的方法可以安全地处理并发修改呢?
put()
,merge()
,compute()
等。 - shmosel