gpt4 book ai didi

Java:需要有关 WeakHashMap 的建议

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:02:58 25 4
gpt4 key购买 nike

我想我是另一个尝试使用 Wea​​kHashMap 创建某种缓存的人。我需要一些帮助。

我有一堆 TrackData 对象,其中包含有关音轨的信息。然后是 Track 对象,它们保持对内部 TrackData 的引用。多个轨道可以指向相同的 TrackData。然后我有如下所示的 TrackDataCache 类:

public class TrackDataCache {
private static TrackDataCache instance = new TrackDataCache();

public static TrackDataCache getInstance() {
return instance;
}

private WeakHashMap<TrackData, WeakReference<TrackData>> cache = new WeakHashMap<TrackData, WeakReference<TrackData>>();

public void cache(Track track) {
TrackData key = track.getTrackData();
WeakReference<TrackData> trackData = cache.get(key);
if (trackData == null) {
cache.put(key, new WeakReference<TrackData>(key));
} else {
track.setTrackData(trackData.get());
}
}
}

因此,当我加载轨道时,我调用 TrackDataCache.cache() 并且如果之前未加载其轨道数据,则将其缓存或替换为缓存副本,否则 (TrackData 覆盖 equals() 方法来检查位置和子歌曲索引)。我想使用弱引用,以便在删除 Tracks 时不需要关心。

我想问一下,在 WeakHashMap 中保留对键的弱引用是否是一种好的做法,如果不行,我应该如何处理这个问题?我需要弱引用和缓存值的恒定时间检索。我正在考虑复制 WeakHashMap 代码并公开 getEntry() 方法,这解决了问题,但这是一个糟糕的 hack :(

附言。我知道 apache 或 google collections 可能有这样的东西,但我真的不想添加 2Mb 依赖项。

最佳答案

我建议更换 WeakReferences SoftReferences .

任何仅由 WeakReference 引用的对象是每一轮垃圾收集器的目标。这意味着即使仍有足够的可用内存,您的缓存也可以被清除。

如果你替换WeakReferenceSoftReference然后你声明:仅当绝对没有可用内存可分配时才删除引用的对象。

没有现成的SoftHashMap java中的实现。 Guava 中有一个很好的例子 - MapMaker .值得在生产环境中使用这个经过良好测试和验证的代码,而不是提供您自己的绝对质量较低的实现。它还具有惊人的“自清洁”机制:

  1. 您可以指定cache max size :

    As the map size grows close to the maximum, the map will evict entries that are less likely to be used again. For example, the map may evict an entry because it hasn't been used recently or very often.

  2. 您可以使用expireAfterWrite 指定 map 条目的过期时间|和 expireAfterAccess方法。

我也发现你的缓存设计不是很方便。据我从您的代码片段中了解到,从开始您的 Track s 对他们的 TrackData 有很强的引用并根据这些情况构建缓存。但是从某些时刻开始,您想要使用缓存来检索数据,因此您必须创建新的 Track它以其他方式出现,因为从那一刻起,您想要使用缓存而不是强引用。

不同 Tracks可以有相同的TrackData所以我们不能使用 Track作为 key 。所以,我会采用下一种方法:

  1. 引入中间ids级别并根据Map<Integer, TrackData>进行缓存具有软值和定义的自清洁策略(基于 MapMaker );
  2. 更改关系Track --> TrackDataTrack --> Id (int) .缓存 Id --> TrackData .

关于Java:需要有关 WeakHashMap 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com