2012-06-20 15 views
13

Próbuję zaimplementować wysoko wydajne buforowanie wątków. Oto kod, który zaimplementowałem. Nie chcę żadnych komputerów na żądanie. Czy mogę użyć cache.asMap() i odzyskać wartość bezpiecznie? Nawet jeśli pamięć podręczna ma ustawione wartości miękkie?Używanie Guavy do buforowania wątków o wysokiej wydajności

import java.io.IOException; 
    import java.util.concurrent.ConcurrentMap; 
    import java.util.concurrent.ExecutionException; 
    import java.util.concurrent.TimeUnit; 
    import java.util.concurrent.TimeoutException; 

    import com.google.common.cache.Cache; 
    import com.google.common.cache.CacheBuilder; 

    public class MemoryCache { 

    private static MemoryCache instance; 
    private Cache<String, Object> cache; 

    private MemoryCache(int concurrencyLevel, int expiration, int size) throws IOException { 

     cache = CacheBuilder.newBuilder().concurrencyLevel(concurrencyLevel).maximumSize(size).softValues() 
      .expireAfterWrite(expiration, TimeUnit.SECONDS).build(); 
    } 

    static public synchronized MemoryCache getInstance() throws IOException { 
     if (instance == null) { 
       instance = new MemoryCache(10000, 3600,1000000); 
     } 
     return instance; 
    } 

    public Object get(String key) { 
     ConcurrentMap<String,Object> map =cache.asMap(); 
     return map.get(key); 
    } 

    public void put(String key, Object obj) { 
     cache.put(key, obj); 
    } 
    } 
+4

Czy jako ciekawostkę, czy naprawdę oczekuje się, że 10000 wątków będzie jednocześnie korzystać z pamięci podręcznej? Pytam, ponieważ jest to wartość, której używasz jako poziom współbieżności. – pcalcao

+0

Nie Usunąłem ten parametr. Używam teraz domyślnego poziomu współbieżności, tj. 4. Dzięki za wskazanie tego. – systemboot

Odpowiedz

21

Guava specjalista tutaj:

Tak, że wygląda dobrze, choć nie jestem pewien, co jest punktem owijania cache w innym obiekcie. (Ponadto, Cache.getIfPresent(key) jest w pełni równoważne z Cache.asMap().get(key).)

+0

Czy nić podręczna Guava jest bezpieczna natywnie? –

+5

@GaryGauh tak, to jest. –

6

Jeśli chcesz uzyskać wysoką wydajność, dlaczego nie chcesz statycznie cache'ować zamiast używać zsynchronizowanej getInstance()?

+1

Zgadzam się. Używanie tego idiomu naprawiałoby synchronizację w getInstance(): https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom – bennidi

Powiązane problemy