并发和CacheLoader.load()

For*_*ato 4 java concurrency caching guava

我应该同步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);
        }} );
Run Code Online (Sandbox Code Playgroud)

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

编辑

就这样我很明确地询问Guava中的缓存问题:http://code.google.com/p/guava-libraries/wiki/CachesExplained

Joh*_*n B 7

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

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

  • 番石榴.它一般适用于缓存,但这个答案是Guava特有的,因为Guava阻止了一些其他缓存所没有的相同密钥. (2认同)