我在维基页面上阅读了有关缓存的代码示例/文档.我看到回调RemovalListener可以用来拆除被驱逐的缓存对象.我的问题是库在确保调用提供的对象之前没有被任何其他线程使用RemovalListener.让我们考虑一下docs中的代码示例:
CacheLoader<Key, DatabaseConnection> loader =
new CacheLoader<Key, DatabaseConnection> () {
public DatabaseConnection load(Key key) throws Exception {
return openConnection(key);
}
};
RemovalListener<Key, DatabaseConnection> removalListener =
new RemovalListener<Key, DatabaseConnection>() {
public void onRemoval(RemovalNotification<Key, DatabaseConnection> removal) {
DatabaseConnection conn = removal.getValue();
conn.close(); // tear down properly
}
};
return CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.MINUTES)
.removalListener(removalListener)
.build(loader);
Run Code Online (Sandbox Code Playgroud)
这里缓存被配置为在创建后2分钟驱逐元素(我知道它可能不是精确的两分钟,因为驱逐将与用户读/写调用等一起捎带)但是不管时间是什么,库是否会检查那里没有活动的引用呈现给传递给的对象RemovalListener?因为我可能有另一个线程长时间从缓存中获取对象但可能仍在使用它.在这种情况下,我无法close()从RemovalListener 调用它.
此外,文档RemovalNotification说明:删除单个条目的通知.如果密钥和/或值已经被垃圾收集,则它们可以为null.
所以根据它conn可以null在上面的例子中.在这种情况下,我们如何正确拆除conn物体?在这种情况下,上面的代码示例也将抛出NullPointerException.
我试图解决的用例是:
closed,但只有在确定没有人使用它们之后.