相关疑难解决方法(0)

ThreadLocal HashMap vs ConcurrentHashMap用于线程安全的未绑定缓存

我正在创建一个具有以下特征的memoization缓存:

  • 高速缓存未命中将导致计算和存储条目
    • 这个计算非常昂贵
    • 这种计算是幂等的
  • 无界限(条目从未删除),因为:
    • 输入将导致最多500个条目
    • 每个存储的条目都很小
    • 缓存相对短缺(通常不到一小时)
    • 总的来说,内存使用不是问题
  • 将有数千个读取 - 在缓存的生命周期中,我预计99.9%+缓存命中
  • 必须是线程安全的

什么会有一个优越的性能,或在什么条件下一个解决方案优于另一个解决方案?

ThreadLocal HashMap:

class MyCache {
    private static class LocalMyCache {
        final Map<K,V> map = new HashMap<K,V>();

        V get(K key) {
            V val = map.get(key);
            if (val == null) {
                val = computeVal(key);
                map.put(key, val);
            }
            return val;
        }
    }

    private final ThreadLocal<LocalMyCache> localCaches = new ThreadLocal<LocalMyCache>() {
        protected LocalMyCache initialValue() {
            return new LocalMyCache();
        }
    };

    public V get(K key) {
        return localCaches.get().get(key);
    }
}
Run Code Online (Sandbox Code Playgroud)

ConcurrentHashMap的: …

java performance caching concurrenthashmap thread-local

8
推荐指数
1
解决办法
1万
查看次数