Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SoftReference实现缓存_Java - Fatal编程技术网

Java 使用SoftReference实现缓存

Java 使用SoftReference实现缓存,java,Java,我有一个可视化数据集的程序。一次可以加载多个数据集,但一次只能显示一个数据集,并且数据集的大小足以导致内存问题。我想做的是实现一种缓存机制,这样每个数据集都被缓存在它们自己的临时文件中,GUI持有对每个数据集的软引用,以便更有效地使用内存。这就是我大致的想法: class DataSetReference extends SoftReference<DataSet> { private File cache; public DataSetReference(DataSe

我有一个可视化数据集的程序。一次可以加载多个数据集,但一次只能显示一个数据集,并且数据集的大小足以导致内存问题。我想做的是实现一种缓存机制,这样每个数据集都被缓存在它们自己的临时文件中,GUI持有对每个数据集的软引用,以便更有效地使用内存。这就是我大致的想法:

class DataSetReference extends SoftReference<DataSet> {
   private File cache;

   public DataSetReference(DataSet referent, byte[] rawData) {
      super(referent);
      // Skip error checking, etc.
      cache = File.createTempFile("abc", null);
      writeDataToCache(cache, rawData);
   }

   @Override
   public DataSet get() {
      if (super.get() == null) {
         refreshReferenceFromCache();
      }
      return super.get();
   }

   private refreshReferenceFromCache() {
      DataSet ds = parseDataSetFromFile(cache);
      // profit???
   }
}
但后来我意识到软引用是不可变的,这扼杀了这个想法。似乎我要做的是在软引用之外重新创建DataSet实例,然后在可视化数据集的GUI组件中创建一个新的软引用并用新的替换旧的引用


我的问题是:是否有一些模式或示例用于使用SoftReference实现缓存?这是我第一次尝试使用软引用,在看过其他一些实现之后,我会感觉更舒服。谢谢。

是的,您必须创建一个新的SoftReference来引用新对象。如果您使用类型为SoftReference的字段而不是扩展它,您可以很容易地做到这一点。SoftReference通常只是实际对象引用的包装,所有这些引用都由容器管理。我将扭转这个问题,构建一个容器来管理数据集的SoftReference并封装序列化行为implemented@immibis谢谢,我按照你的建议重构了这个类。@harshtuna我查看了guava缓存,缓存加载机制看起来很有趣。谢谢你的链接。