我正在使用番石榴的高速缓存,并设置了concurrencyLevel
到1
,所以最大容量被利用w.r.t.驱逐问题。以下是我的代码:是番石榴高速缓存的读锁锁
CacheBuilder.newBuilder()
.maximumWeight(maxWeight)
.concurrencyLevel(1)
.expireAfterWrite(expireDuration, TimeUnit.MINUTES)
.removalListener(new RemovalListener<K, V>() {
@Override
public void onRemoval(RemovalNotification<K, V> removalNotification) {
log.warn(removalMsg + removalNotification.getKey());
}
})
.weigher(weigher)
.build();
的concurrencyLevel文档这样说:
指南更新操作中允许的并发。作为内部尺寸的提示 。该表在内部划分,试图 许可证并发更新的数量表示不 争...
,因此我假设concurrencyLevel
发挥作用仅update operations
和READs are Lock Free
即使concurrencyLevel(1)
。
我的假设是否正确?
编辑: 我看着番石榴缓存codeand它看起来像我的假设:READs are lock free
是正确的。如果是get(K, Callable)
,它最初会尝试在没有锁定的情况下获取该值,并且如果指定键的条目为null或仅过期,则该条目将用于锁定的Get或Load。如果我在这里错了,请纠正我。
他们如何可能是无锁的,如果你使用的是只有一个分区,而不是整数倍?整个分区点不会增加缓存不同部分的争用。 –
但是为什么文档特别说'允许更新操作之间的并发性'并且没有提及读取操作。我曾认为在这里类似于'ConcurrentHashMap',读取通常是无锁的。 –