栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

WeakHashMap迭代和垃圾回收

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

WeakHashMap迭代和垃圾回收

正如bkail所说,当GC从a中“删除”一个条目时,

WeakHashMap
它不会引起并发修改。实际上,GC通过对
WeakReference
对象本身(包含实键)的硬引用来收集基础对象。因此,不会收集由映射直接引用的真实对象(引用对象),因此直到您的线程中的一个调用此映射中的方法之前,映射不会更改。那时,映射从GC检查引用队列,并找到所有已收集的键并将其从映射中删除-
因此,对映射结构的实际更改发生在您的一个线程上。

考虑到这一点,那么在某些情况下,您可能会在这样的映射中进行并发修改,而您不会在另一种映射中得到并发修改-
如果您放置已经存在的键或调用getter方法。但是,实际上,在并发应用程序中,无论如何,您都应该锁定这些调用,以便在程序中存在真正的并发访问错误。

话虽如此,您实际上 不应该将其

WeakHashMap
用于缓存(即使您正在谈论缓存密钥)。在缓存中,当不再引用值时,您不希望您的值“神奇地”消失。通常,您希望它们在有一定的最大数量时(例如Apache
collections
LRUMap
)消失,或者根据内存需求释放它们。

对于以后的版本,您可以将地图与一起使用

SoftReference
(Apache集合提供了一个地图
ReferenceMap
,可让您指定键或值的引用类型)。指定软引用只能根据内存压力来释放-
另一方面,弱引用必须与GC一起做更多事情,因为它认识到对象没有剩余的硬引用,可以随时释放它。当然,软引用的实际工作方式还取决于JVM的实现。

编辑 :我重读了您的问题,并想解决另一点。由于实际修改发生

WeakHashMap
在您自己线程上的内部结构上,因此,
如果仅在单个线程中使用此映射,则不需要同步任何方法调用 。这种行为与其他行为没有什么不同
Map



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号