4

我应该同步 CacheLoader.load() 中的代码吗?

我有这样的代码:

final Calculator calculator = new Calculator();

final LoadingCache<Key, Value> cache = CacheBuilder.newBuilder().build(new CacheLoader<Key, Value>(){
        @Override
        public Value load(final Key key) throws Exception {
            return calculator.calc(key);
        }} );

如果缓存需要从两个不同的线程加载两个不同键的值,我是否必须担心 Calculator 对象中的线程干扰?即我应该声明我的 Calculator.calc() 方法同步(或做其他事情来确保线程安全)?

编辑

为了清楚起见,我特别询问有关 Guava 中的缓存:http ://code.google.com/p/guava-libraries/wiki/CachesExplained

4

3 回答 3

8

这取决于load方法中操作的线程安全性。它可以针对不同的键同时执行。因此,如果该操作不是线程安全的,则应该以某种方式进行(同步是最简单的选项)。

因此,如果calculator.calc(key)不是线程安全的,请同步它。如果是,不要。

于 2013-06-20T11:39:13.117 回答
0

如果线程只会读取,那么您不必同步。如果线程要操作缓存的值,那么读取和写入操作都应该同步。

于 2013-06-20T11:33:21.720 回答
0

感谢所有回答的人。

我已经用一个小测试程序对此进行了检查,并且存在线程干扰。特别是当 CacheLoader 必须被调用时,对于不同的键,这些调用是不同步的,所以如果 Calcualtor.calc() 不是线程安全的,那么就会出现奇怪的结果。

于 2013-06-20T12:07:15.823 回答