相关疑难解决方法(0)

java中一个对象的线程安全缓存

假设我们的应用程序中有一个CountryList对象,它应返回国家/地区列表.加载国家是一项繁重的操作,因此应该缓存该列表.

其他要求:

  • CountryList应该是线程安全的
  • CountryList应加载延迟(仅按需)
  • CountryList应支持缓存失效
  • 考虑到缓存很少会失效,应优化CountryList

我提出了以下解决方案:

public class CountryList {
    private static final Object ONE = new Integer(1);

    // MapMaker is from Google Collections Library    
    private Map<Object, List<String>> cache = new MapMaker()
        .initialCapacity(1)
        .makeComputingMap(
            new Function<Object, List<String>>() {
                @Override
                public List<String> apply(Object from) {
                    return loadCountryList();
                }
            });

    private List<String> loadCountryList() {
        // HEAVY OPERATION TO LOAD DATA
    }

    public List<String> list() {
        return cache.get(ONE);
    }

    public void invalidateCache() {
        cache.remove(ONE);
    }
}
Run Code Online (Sandbox Code Playgroud)

你怎么看待这件事?你觉得它有什么坏处吗?还有其他办法吗?我怎样才能让它变得更好?我应该在这种情况下寻找另一种解决方案吗?

谢谢.

java caching lazy-loading

37
推荐指数
3
解决办法
2万
查看次数

Java memoization方法

我遇到了一个有趣的问题,并想知道是否以及如何在Java中完成:创建一个可以记住任何函数/方法的方法.该方法具有以下参数:方法/函数及其参数.

例如,假设我有这种方法:

int addOne(int a) { return a + 1;}
Run Code Online (Sandbox Code Playgroud)

并且我使用相同的参数调用我的memoization方法两次:例如addOne和5,第一个调用应该实际调用addOne方法并返回结果并且还存储该给定参数的结果.第二次我打电话的时候应该知道之前已经打过电话,只是查看上一个答案.

我的想法是有一个类似于HashMap<Callable,HashMap<List<Objects>,Object>>你将存储以前的答案并在以后查找它们的地方.我认为这可以用lambda表达式以某种方式完成但我不熟悉它们.我不太确定写这个方法,并希望得到一些帮助.

这可以通过这种方法完成吗?

java lambda memoization

12
推荐指数
2
解决办法
1万
查看次数

从方法java返回"常量"值

我不太确定这是否可能,所以这就是我问你们的原因.我想写一个方法,知道它之前是否已被访问过,如果它返回了它上次访问时的相同值.我不能为此使用字段/实例变量.

这是我想要做的,没有实例变量foo:

private FooObject foo = null;
public int setFoo(FooObject in)
{
    if(foo == null)
        foo = in;

    return foo.getX();
}
Run Code Online (Sandbox Code Playgroud)

这可以吗?

java memoization

1
推荐指数
1
解决办法
422
查看次数

标签 统计

java ×3

memoization ×2

caching ×1

lambda ×1

lazy-loading ×1