2012-06-20 15 views
13

高性能スレッドセーフキャッシュを実装しようとしています。ここに私が実装したコードがあります。私はオンデマンドコンピューティングを望んでいません。 cache.asMap()を使用して値を安全に取得できますか?キャッシュがsoftValuesを持つように設定されていても?ここ高性能スレッドセーフキャッシュにGuavaを使用する

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

好奇心として、キャッシュに同時にアクセスする10000スレッドがあると本当に思いますか?私はこれが同時性レベルとして使用している値なので、尋ねます。 – pcalcao

+0

いいえこのパラメータを削除しました。私は現在、デフォルトの並行処理レベルすなわち4を使用しています。それを指摘してくれてありがとう。 – systemboot

答えて

21

グァバコントリビュータ:

私はポイントが別のオブジェクトのキャッシュをラップするのが何であるかわからないが、はい、それは、単に正常に見えます。 (Cache.getIfPresent(key)Cache.asMap().get(key)と完全に一致します)

+0

Guavaのキャッシュスレッドはネイティブで安全ですか? –

+5

@GaryGauhはいそうです。 –

6

パフォーマンスを向上させたい場合は、同期化されたgetInstance()を使用せずにキャッシュを静的にインスタンス化するのはなぜですか?

+1

同意します。このイディオムを使用すると、getInstance()の同期が改善されます。https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom – bennidi

関連する問題