MapMaker

MapMaker

我们将 MapMaker 作为一个提供最基本缓存功能的类进行学 习,MapMaker 类使用了流畅的接口 API,允许我们快速的构造 ConcurrentHashMap,我们来看下面的例子:

ConcurrentMap<String, Book> books = new
        MapMaker().concurrencyLevel(2)
        .softValues()
        .makeMap();

// 更为完整的示例
ConcurrentMap<String, Object> mapAll = new MapMaker()
        .concurrencyLevel(8)
        .weakValues()
        .expireAfterWrite(30, TimeUnit.SECONDS)
        .maximumSize(100)
        .makeComputingMap(
          new Function<String, Object>() {
            public Object apply(String key) {
            //绑定获取数据的方法
              return createObject(key);
         }

            private Object createObject(String key) {
                // TODO Auto-generated method stub
                return null;
            }});

上面的例子中,我们构造了一个 ConcurrentHashMap,使用 String 类型作为 key,使用 Book 对象作为 value 值,通过对 ConcurrentHashMap 声明的泛型进行指定,我们首先调用了 concurrencyLevel()方法,设置了我们允许在 map 中并发修改的数量,我们还指定了 softValues()方法,这样 map 中的 value 值都包裹在一个 SoftReference(软引用)对象中,可以在内存过低的时候被当作垃圾回收。

其他我们可以指定的方法还包括:weakKeys()和 weakValues(),但是 MapMaker 没有提供 softKeys(),当我们给 keys 或 values 使用 WeakReferences(弱引用)或 SoftReference(软引用)时,如果键值的其中一个被当做垃圾回收,整个键值对就 会从 map 中移除,剩余的部分并不会暴露给客户端。

最后值得注意的一点:MapMaker 中的 softValues()方法在最近的几个 guava 版本中,已经被标注为 Deprecated,MapMaker 中的缓存机制已经被移动到 com.google.common.cache.CacheBuilder 中,MapMaker 中的 softValues()方法也已经被替换为 com.google.common.cache.CacheBuilder#softValues,CacheBuilder 的实现是来自 MapMaker 分支的一个简单增强版 API。

上一页