Java:google guava缓存穿透原理分析

Guava缓存穿透利用ReentrantLock实现并发控制,当缓存失效时,多个线程回源会被阻塞。LocalCache的Segment继承ReentrantLock,数组大小可调整。回源时,特定Segment执行lockedGetOrLoad,通过lock()确保回源过程的互斥,防止并发问题。合理设置concurrencyLevel以优化并发性能。
摘要由CSDN通过智能技术生成

google guava缓存穿透使用ReentrantLock(可重入锁)实现,当某个key在缓存中失效并执行回源,其他线程将会阻塞,直到回源完成。

1)ReentrantLock管理

LocalCache中包含内部类Segment,该类继承了ReentrantLock 

static class Segment<K, V> extends ReentrantLock {
  

在LocalCache构造函数中,会初始化Segment<K, V>数组,默认大小为4,可以通过builder的concurrencyLevel来控制大小。数组大小增长为2的倍数,如果设置了concurrencyLevel=100,则实际的大小为64.

2)回源管理

当我们请求一个key的数据并需要回源的时候,LocalCache会根据key来进行hash,并指定某个Segment<K, V>,执行get方法

  V get(K key, CacheLoader<? super K, V> loader) throws ExecutionException {
    int hash = hash(checkNotNull(key));
    return segmentFor(hash).get(key, hash, loader);
  }

如果key需要回源,执行Segment<K, V>::lockedGetOrLoad方法,注意到lock()。lock会阻塞其他线程,直到回源结束


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值