2012-06-20 3 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