【问题标题】:Would Guava's Cache<K, Semaphore> with weakValues() be thread safe?Guava 的 Cache<K, Semaphore> with weakValues() 是线程安全的吗?
【发布时间】:2016-02-15 13:12:00
【问题描述】:

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

虽然ConcurrentMap&lt;K, Semaphore&gt; 足以满足并发性,但我也不希望映射累积旧键并无限增长。

理想情况下,数据结构将最终(或紧接着)释放用于未使用锁的键的内存。

我有点想用weakValues() 构建的 Guava 的 Cache 可以解决问题:

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);
            }
        });

这可能无法提供足够的并发控制有什么原因吗?

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

【问题讨论】:

    标签: java multithreading guava weak-references


    【解决方案1】:

    是的,那会起作用。

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

    【讨论】:

    • 应该注意com.google.common.util.concurrent.Striped 保证每个键同步对象。允许多个键共享同一个对象,这可以降低并发性。因此,Striped 可能是也可能不是一个可行的选项,具体取决于设计/用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2021-10-12
    • 2015-04-18
    • 2011-10-07
    相关资源
    最近更新 更多