2012-06-20 15 views
13

Sto tentando di implementare una memorizzazione nella cache thread-safe ad alte prestazioni. Ecco il codice che ho implementato. Non voglio alcun calcolo on demand. Posso usare cache.asMap() e recuperare il valore in sicurezza? Anche se la cache è impostata per avere softValues?Utilizzo di Guava per la memorizzazione nella cache sicura da threading ad alte prestazioni

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

Come curiosità, ti aspetti veramente di avere 10000 thread che accedono contemporaneamente alla tua cache? Chiedo poiché è il valore che stai utilizzando come livello di concorrenza. – pcalcao

+0

No, ho rimosso quel parametro. Ora sto usando il livello di concorrenza predefinito, ad es. 4. Grazie per l'attenzione però. – systemboot

risposta

21

Guava collaboratore qui:

Sì, che sembra più che bene, anche se non sono sicuro di quello che il punto è di avvolgere la cache in un altro oggetto. (Inoltre, è completamente equivalente a Cache.asMap().get(key).)

+0

Il thread della cache di Guava è sicuro in modo nativo? –

+5

@GaryGauh sì, lo è. –

6

Se si desidera prestazioni elevate, perché non si instaza la cache in modo statico anziché utilizzare getInstance() sincronizzato?

+1

Accetto. L'uso di questo idioma risolverebbe la sincronizzazione su getInstance(): https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom – bennidi

Problemi correlati