gpt4 book ai didi

java - 删除已删除的 ConcurrentHashMap 元素有多安全?

转载 作者:行者123 更新时间:2023-12-02 07:44:41 34 4
gpt4 key购买 nike

如果是以下代码,则由多个线程运行:

private static final Map<String, keyinfo> mapKeys = new ConcurrentHashMap<String, keyinfo>();

private static void purgeOldKeys() {
for (Map.Entry<String, keyinfo> key : mapKeys.entrySet()) {
if(key.getValue().createTime + keyCacheTime < getCurrentDBTime())
mapKeys.remove(key);
}
}

我可以避免使用同步器吗?

或者因为删除已经删除的元素,未根据 JavaDoc 定义,所以仍然需要同步器?

最佳答案

一般来说,当从集合中删除时,使用完整的 Iterator 会更干净(也更快!) API 而不是懒惰的“foreach”概念。

iterator.remove();不会使迭代器失效;它知道它所在的位置。使用此模式:

for (Iterator<> iter = map.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry<> entry = iter.next();
if (testRemoval(entry))
iter.remove(); // <----- remove using the iterator position!
}

速度更快,因为它不涉及再次搜索对象。它更加健壮,因为迭代器知道对象已被删除。在许多集合中,上面显示的代码将由于并发修改而“快速失败”。

关于java - 删除已删除的 ConcurrentHashMap 元素有多安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14585829/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com