google collection工具包的MapMaker使用
摘自网上描述语段:
Google Collections中的MapMaker融合了Weak Reference,线程安全,高并发性能,异步超时清理,自定义构建元素等强大功能于一身。
常阅读优秀源代码的童鞋都知道,一般叫Maker的对象都是Builder模式,而这个MapMaker就是来”Build“Map的.
一、google collection工具包的MapMaker使用:
public static void main(String[] args) { /** * expiration(3, TimeUnit.SECONDS)设置超时时间为3秒 */ ConcurrentMap<String , String> map = new MapMaker().concurrencyLevel(32).softKeys().weakValues() .expiration(3, TimeUnit.SECONDS).makeComputingMap( /** * 提供当Map里面不包含所get的项,可以自动加入到Map的功能 * 可以将这里的返回值放到对应的key的value中 */ new Function<String, String>() { public String apply(String s) { return "creating " + s + " -> Object"; } } ); map.put("a","testa"); map.put("b","testb"); System.out.println(map.get("a")); System.out.println(map.get("b")); System.out.println(map.get("c")); try { // 4秒后,大于超时时间,缓存失效。 Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(map.get("a")); System.out.println(map.get("b")); System.out.println(map.get("c")); }
结果如下:
testa testb creating c -> Object creating a -> Object creating b -> Object creating c -> Object
二、先看下其api的相关demo片段:
// 使用案例:存储验证码 // <String, String> == <用户唯一,验证码> // expiration(15, TimeUnit.MINUTES) 有效期15分钟 ConcurrentMap<String,String> capthcaMap = new MapMaker().expiration(15, TimeUnit.MINUTES).makeMap(); // 设置ConcurrentMap的concurrencyLevel参数 ,例如ConcurrentHashMap是用来控制其Segment数组的大小 ConcurrentMap<String,Object> map1 = new MapMaker().concurrencyLevel(8).makeMap(); // 构造各种不同reference作为key和value的map ConcurrentMap<String,Object> map2 = new MapMaker().softKeys().weakValues().makeMap(); // 提供当Map里面不包含所get的项,可以自动加入到Map的功能 ConcurrentMap<String,Integer> map3 = new MapMaker() .makeComputingMap( new Function<String, Integer>() { public Integer apply(String key) { return 1; } } );
可以看出过了4秒后,缓存失效,所以呈现如此结果。