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

猜你喜欢

转载自blog.csdn.net/weixin_40632321/article/details/88313236
今日推荐