2015-10-25 20 views
0

默认情况下,Google Guava Cache是​​否在同一个线程上加载缓存?Google Guava Cache是​​否加载在同一个线程上?

代码:

cache = CacheBuilder 
    .newBuilder() 
    .refreshAfterWrite(2, TimeUnit.SECONDS) 
    .build(new CacheLoader<String,String>() { 
     @Override 
     public String load(String s) throws Exception { 
      return addCache(s); 
     } 
}); 

将向addCache调用不同的线程进行?据我所知,这是一个同步通话,但我不确定。

回答

4

这里有一个简单的测试,让知道:

System.out.println("Thread.currentThread() = " + Thread.currentThread()); 
    LoadingCache<String, String> cache = CacheBuilder 
     .newBuilder() 
     .refreshAfterWrite(2, TimeUnit.SECONDS) 
     .build(new CacheLoader<String, String>() { 
      @Override 
      public String load(String s) throws Exception { 
       System.out.println("Thread.currentThread() = " + Thread.currentThread()); 
       return "world"; 
      } 
     }); 
    cache.get("hello"); 

输出:

Thread.currentThread() = Thread[main,5,main] 
Thread.currentThread() = Thread[main,5,main] 

当然,作为文档表明,如果另一个线程已经开始装载值的键,当前线程将不会重新加载它:它将等待值由另一个加载:

如果另一个调用t get(K)或getUnchecked(K)当前正在加载key的值,只是等待该线程完成并返回其加载的值。

+1

谢谢!其实我已经写了这个测试,它确实返回了相同的线程ID。但是文件让我困惑了一下。我认为我没有正确使用缓存。所以,为了清楚起见,我们需要将'CacheLoader.reload'重载为异步,对吧? –

+0

它很晚才回答,但是您必须为您的CacheLoader重载它。 –

相关问题