快速背景我有一个并发映射,我用来缓存一些经常更改的值(仍然值得从测试中缓存它们).我想通过检查值中的过期时间来定期从我的缓存中逐出项目.我使用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,并保证在构造迭代器时遍历元素,并且可能(但不保证)反映构造之后的任何修改.
即你可以删除东西,你应该没事.
如果你没有使用这个实现,那么你使用哪些(以及为什么?不好笑,但知道你为什么做出这个选择会很有趣)
您使用的是Java Concurrent HashMap吗?从keySet()文档中看起来它表现得很有用.
返回此映射中包含的键的set视图.该集由地图支持,因此对地图的更改将反映在集中,反之亦然.该集支持元素删除,它通过Iterator.remove,Set.remove,removeAll,retainAll和clear操作从此映射中删除相应的映射.它不支持add或addAll操作.视图的返回迭代器是一个"弱一致"的迭代器,它永远不会抛出ConcurrentModificationException,并保证在构造迭代器时遍历元素,并且可能(但不保证)反映构造之后的任何修改.
即你可以删除东西,你应该没事.
如果你没有使用这个实现,那么你使用哪些(以及为什么?不好笑,但知道你为什么做出这个选择会很有趣)