使用weakValues()的Guava缓存是否是线程安全的?

我需要一个按键锁定机制来保护键绑定的关键部分.

虽然ConcurrentMap< K,Semaphore>对于并发来说已经足够了,我也不希望地图累积旧密钥并无限增长.

理想情况下,数据结构最终(或直接)释放用于未使用锁的密钥的内存.

我有点认为使用weakValues()构建的Guava缓存可以解决这个问题:

private static final LoadingCache<K, Semaphore> KEY_MUTEX = CacheBuilder.newBuilder()
        .weakValues()
        .build(new CacheLoader<K, Semaphore>() {
            @Override
            public Semaphore load(K key) throws Exception {
                return new Semaphore(1);
            }
        });

是否有任何理由可能无法提供足够的并发控制?

或者为什么这可能不会导致未使用的对被垃圾收集?

最佳答案
是的,那是行得通的.

还有一个或多或少为此用例设计的数据结构:Striped.

转载注明原文:使用weakValues()的Guava缓存是否是线程安全的? - 代码日志