当前位置:  开发笔记 > 编程语言 > 正文

修改映射并迭代键集时,Java ConcurentMap keySet()问题

如何解决《修改映射并迭代键集时,JavaConcurentMapkeySet()问题》经验,为你挑选了1个好方法。

快速背景我有一个并发映射,我用来缓存一些经常更改的值(仍然值得从测试中缓存它们).我想通过检查值中的过期时间来定期从我的缓存中逐出项目.我使用keySet()方法获取对我所有键的引用,然后检查值,如果过期我删除它们.在其他线程中,正在不断查询和更新(删除)缓存.

从keySet()的javadocs中可以看出,当我迭代键集时,地图是否会发生变化.设置结果是未定义的.显然我想要一种定义的方法来处理这个,所以结果是有效的.是否足以将Set传递给HashSet然后迭代这个集合,因为我理解这个集合不会被映射支持,这是否浪费了内存的方式呢?任何想法都赞赏.

不幸的是,我的逐出器不是从并发映射中删除项目的唯一方法,所以我说我需要在迭代之前将keySet复制到另一个Set.

提前致谢

编辑:事实证明我正在读取Map keySet()方法的javadocs而不是ConcurrentMap keySet().谢谢我的坏:)

返回此映射中包含的键的set视图.该集由地图支持,因此对地图的更改将反映在集中,反之亦然.如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的.该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll retainAll和clear操作从地图中删除相应的映射.它不支持add或addAll操作.

Brian Agnew.. 6

您使用的是Java Concurrent HashMap吗?从keySet()文档中看起来它表现得很有用.

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

即你可以删除东西,你应该没事.

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



1> Brian Agnew..:

您使用的是Java Concurrent HashMap吗?从keySet()文档中看起来它表现得很有用.

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

即你可以删除东西,你应该没事.

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

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有