有时我们需要在缓存被移除时得到这个通知,并做一些额外处理。这时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