guava缓存原理--listener

有时我们需要在缓存被移除时得到这个通知,并做一些额外处理。这时RemovalListener就派上用场了。

RemovalListener<Integer, AtomicInteger> removalListener =
        new RemovalListener<Integer, AtomicInteger>() {
          //覆盖接口的onRemoval方法用于自定义节点被移除时的操作
          @Override
          public void onRemoval(RemovalNotification<Integer, AtomicInteger> notification) {
            System.out.println("isRemoving");
          }
        };

    CacheLoader<Integer, AtomicInteger> loader =
        new CacheLoader<Integer, AtomicInteger>() {
          @Override
          public AtomicInteger load(Integer key) {
            applyCount.incrementAndGet();
            return new AtomicInteger();
          }
        };

    LoadingCache<Integer, AtomicInteger> cache =
        CacheBuilder.newBuilder()
            .removalListener(removalListener)
            .expireAfterWrite(10, MILLISECONDS)
            .ticker(ticker)
            .build(loader);

原理

com.google.common.cache.LocalCache
//构建队列
final Queue<RemovalNotification<K, V>> removalNotificationQueue 
= (removalListener == NullListener.INSTANCE)
            ? LocalCache.<RemovalNotification<K, V>>discardingQueue()
            : new ConcurrentLinkedQueue<RemovalNotification<K, V>>();

//入队过程,在节点不存在、节点已过期、缓存clear等操作时调用
com.google.common.cache.LocalCache.Segment#enqueueNotification
//清理队列过程,在读写操作最后的cleanup方法中调用
com.google.common.cache.LocalCache#processPendingNotifications
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值