google guava框架实现的缓存可以很方便的对需要的缓存对象设置生命周期,及缓存对象的弱引用 强应用 软引用等
public static void main(String[] args) throws InterruptedException {
Cache<String, Book> cahce=CacheBuilder.newBuilder().expireAfterAccess(8, TimeUnit.SECONDS).maximumSize(10).build(new CacheLoader<String, Book>() {
@Override
public Book load(String key) throws Exception {
Book b=new Book();
return b;
}
});
Book b=cahce.apply("q");
System.out.println(b);
Book b2=cahce.apply("q");
System.out.println(b2);
Thread.currentThread();
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
Book b3=cahce.apply("q");
System.out.println(b3);
}
输出:
org.zero.resource.Book@be2358
org.zero.resource.Book@be2358
org.zero.resource.Book@32fb4f
可见对象book对象的缓存在8秒后被移除.
下面来看
maximumSize(1) 的作用,是指最大缓存对象的数目
public static void main(String[] args) throws InterruptedException {
CacheBuilder<String, Book> cahceBuilder=CacheBuilder.newBuilder().expireAfterAccess(8, TimeUnit.SECONDS).maximumSize(1).removalListener(new RemovalListener<String, Book>() {
@Override
public void onRemoval(RemovalNotification<String, Book> rn) {
System.out.println(rn.getKey()+"被移除");
}
});
Cache<String, Book> cahce=cahceBuilder.build(new CacheLoader<String, Book>() {
@Override
public Book load(String key) throws Exception {
Book b=new Book();
return b;
}
});
Book book_1_0=cahce.apply("book_1");//缓存book_1对象
System.out.println(book_1_0);
Book book_2_0=cahce.apply("book_2");//因为maximumSize设为1,故不能同时缓存两个或两个以上的对象,所以必须先移除之前的缓存对象book_1 再缓存book_2对象
System.out.println(book_2_0);
Book book_1_1=cahce.apply("book_1");//获取book_1 对象,如果存在则返回,否则创建新的对象,并将之缓存(book_2会被移除).
System.out.println(book_1_1);
Book book_2_1=cahce.apply("book_2");
System.out.println(book_2_1);//org.zero.resource.Book@133f1d7
Book book_2_1_=cahce.apply("book_2");
System.out.println(book_2_1_);//org.zero.resource.Book@133f1d7
}
输出:
org.zero.resource.Book@1ed2ae8
book_1被移除
org.zero.resource.Book@32fb4f
book_2被移除
org.zero.resource.Book@1113708
book_1被移除
org.zero.resource.Book@133f1d7
org.zero.resource.Book@133f1d7
当
maximumSize设置为2或更大值时,输出:
org.zero.resource.Book@1ed2ae8
org.zero.resource.Book@19c26f5
org.zero.resource.Book@1ed2ae8
org.zero.resource.Book@19c26f5
org.zero.resource.Book@19c26f5
可见,并未移除任何对象
=============================guava15 版后,有所改动============================
在新版本中(有可能在15之前就已经改变了),Cache 新增了子接口LoadingCache,和子类LocalManualCache ,子抽象类ForwardingCache 等. Cache使用接口有所改变,但是不大.
Cache接口中移除了apply 等方法, 在LoadingCache 中以get()或者getUnchecked() 代替