Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurentMap keySet()当修改映射并在键集上迭代时的问题_Java_Concurrency_Map - Fatal编程技术网

Java ConcurentMap keySet()当修改映射并在键集上迭代时的问题

Java ConcurentMap keySet()当修改映射并在键集上迭代时的问题,java,concurrency,map,Java,Concurrency,Map,Quick background我有一个并发映射,用于缓存一些经常更改的值(仍然值得从测试中缓存它们)。我希望通过检查值中的过期时间,定期从缓存中逐出项目。我使用keySet()方法获取对所有键的引用,然后检查这些值,如果过期,则删除它们。在其他线程中,缓存不断被查询和更新(删除) 在javadocs for keySet()中提到,如果在我迭代密钥集时映射发生变化,则结果是未定义的。显然,我希望有一个明确的方法来处理这个问题,这样结果才是有效的。将该集传递给HashSet,然后在该集上迭代是否

Quick background我有一个并发映射,用于缓存一些经常更改的值(仍然值得从测试中缓存它们)。我希望通过检查值中的过期时间,定期从缓存中逐出项目。我使用keySet()方法获取对所有键的引用,然后检查这些值,如果过期,则删除它们。在其他线程中,缓存不断被查询和更新(删除)

在javadocs for keySet()中提到,如果在我迭代密钥集时映射发生变化,则结果是未定义的。显然,我希望有一个明确的方法来处理这个问题,这样结果才是有效的。将该集传递给HashSet,然后在该集上迭代是否足够,因为据我所知,该集不受映射的支持,这是一种浪费内存的方法吗?任何想法都值得赞赏

不幸的是,我的逐出器并不是从并发映射中删除项的唯一方法,所以我说我需要在遍历键集之前将其复制到另一个键集,这是正确的

提前谢谢

编辑:原来我是在读Map keySet()方法的javadocs,而不是ConcurrentMap keySet()。谢谢我的坏:)

返回键的集合视图 包含在这张地图上。布景是 以地图为后盾,因此对 地图反映在集合中,并且 反之亦然。如果地图被修改 当集合上的迭代处于 进展(除通过 迭代器自身的删除操作),该 迭代的结果如下所示 未定义。集合支持元素 移除,该操作将移除 从地图上对应映射, 通过迭代器.remove、Set.remove、, 移除所有保留物,并清除 操作。它不支持 添加或添加所有操作


如果LRU缓存足以满足您的需求,请检查-它使实现LRU缓存变得微不足道,然后您可以通过调用将其包装为线程安全的。您正在使用吗?从keySet()文档中可以看出,它的行为方式非常有用

返回此映射中包含的键的集合视图。集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。该集合支持元素移除,即通过Iterator.remove、set.remove、removeAll、retainal和clear操作从此映射中移除相应的映射。它不支持添加或添加所有操作。视图返回的迭代器是一个“弱一致性”迭代器,它永远不会抛出ConcurrentModificationException,并保证在构造迭代器时遍历元素,并且可能(但不保证)反映构造之后的任何修改

i、 你可以把东西移走,你会没事的


如果您没有使用这个实现,那么您使用的是哪一个(为什么?不好笑,但知道您为什么做出这个选择会很有趣)

非常感谢Brian ye我使用的是并发hashmap,但是当查看javadocs时,我正在阅读docs for map:)非常感谢