She*_*ari 5 java weakhashmap guava
我读过许多人非常喜欢Google Guava(收藏集)的MapMaker,但是我看不出它有什么用处.
我已经阅读了javadoc,它说它的行为类似于ConcurrentHashMap.它还说new MapMaker().weakKeys().makeMap()几乎可以永远用作WeakHashMap的替代品.
但是,读取ConcurrentHashMap和WeakHashMap的javadoc 会让我想知道何时使用它是有用的?在我看来,你不能保证你在地图中放置的任何内容都会存在,或者我被误解了?
问题MapMaker在于,您构建的地图类型有很多选项,这使得这些地图能够用于多种用途.
Function<K, V>来自动检索与给定键相关联的值(如果它尚未在映射中).这与软值和/或到期时间很好地结合.在地图驱逐条目后(由于内存需求或到期),下次请求与该键关联的值时,它将自动被检索并再次缓存在地图中.......这有点重要.如果您不想(或不能承受)在内存中保留一个对象,那么弱引用很有用.请考虑以下用例:您需要将信息与类相关联.现在,由于您在一个可能重新加载类的环境中运行(例如,Tomcat或OSGi环境),您希望垃圾收集器能够在它认为安全的情况下尽快回收旧版本的类. .
实现这一目标的初步尝试可能看起来像
class ClassAssoc {
private final IdentityHashMap<Class<?>,MyMetaData> cache = new ...;
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是:这将cache永远保留成员中的所有类(或者至少,除非它们被手动删除),迫使垃圾收集器无限期地保留它们,包括从类引用的所有内容(静态成员值,类加载器信息, ...)
通过使用弱引用,垃圾收集器只要不存在对它的其他引用(通常是实例)就可以回收旧版本的类.另一方面:只要存在这样的引用,就保证该值也可以从弱引用对象到达,因此,它是缓存表中的有效键.
将并发和其他暴行添加到图片中,您可以MapMaker选择同时提供...
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |