java - Guava 的 Cache<K, Semaphore> 和 weakValues() 是线程安全的吗?

标签 java multithreading guava weak-references

我需要一个按键锁定机制来保护按键绑定(bind)的关键部分。

尽管 ConcurrentMap<K, Semaphore>对于并发就足够了,我也不希望 map 累积旧 key 并无限增长。

理想情况下,数据结构最终(或之后立即)释放用于未使用锁的键的内存。

我有点想 Guava 的 CacheweakValues() build 会成功的:

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 .

关于java - Guava 的 Cache<K, Semaphore> 和 weakValues() 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35410272/

相关文章:

c++ - 线程数之间的事件c++

java - 如何使用 Guava 创建现有集合的多个 Multimap 实时 View

json - 在 Spring Boot 项目中启用 Multimap 的 json 序列化

java - 方法 : java. util.Date.parse() 的无签名适用于参数类型

java - 无法从 Pig 解析 Java UDF 中的方法

java - DAO设计模式

multithreading - 我们可以在 docker 中运行多进程程序吗?

c++ - 在消费者循环中重用 unique_lock

java - 如何从依赖中获取子依赖或版本?

java - Java中有没有办法预加1以上?