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(),当我们给keysvalues使用WeakReferences(弱引用)SoftReference(软引用)时,如果键值的其中一个被当做垃圾回收,整个键值对就 会从map中移除,剩余的部分并不会暴露给客户端。

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

上一页