Google Collections(Guava)中强大的Concurrent MapMaker

JDK 1.5引入的ConcurrentHashMap由于其精巧的设计,更高的并发性能,捕获了大家的心,在并发场景中出场率极高,但随着深入的使用,很快的 就发现了其中的不足。例如在以Map作为Cache的典型场景中,我们都需要有元素过期的处理,WeakHashMap是这方面的高手,但其在并发方面有 点菜(非线程安全),当我们想让这两位大将同时上场的时候,就只能抓耳搔腮了。

Google Collections中的MapMaker融合了Weak Reference,线程安全,高并发性能,异步超时清理,自定义构建元素等强大功能于一身,除了可以设置超时功能外,还可以绑定key的未取到值的function,当通过get(key)取缓存为空的时候,可以通过这个绑定的function来将返回值put到缓存中,留着下一次get。

       听完这些介绍,心动不已,找个时间,简单的test了下MapMaker,果然感觉很强大。

       GoogleCollection的下载地址:http://code.google.com/p/google-collections/       

import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;

import com.google.common.base.Function;
import com.google.common.collect.MapMaker;

/**
 * @author guoliang created GoogleColTestMain.java
 * @since 2010-4-28 下午05:48:55
 */
public class GoogleColTestMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
    	/**
    	 * softKeys
    	 * weakValues
    	 * 可以设置key跟value的strong,soft,weak属性。不错不错。
    	 * expiration(3, TimeUnit.SECONDS)设置超时时间为3秒
    	 * 
    	 */
        ConcurrentMap<String, String> testMap = new MapMaker().concurrencyLevel(32).softKeys().weakValues().expiration(
                3, TimeUnit.SECONDS).makeComputingMap(new Function<String, String>() {
            /**
             * 这里就是绑定的根据key没找到value的时候触发的function,
             * 可以将这里的返回值放到对应的key的value中!
             * @param arg0
             * @return
             */
            @Override
            public String apply(String arg0) {
                return "create:" + arg0;
            }

        });

        testMap.put("a", "testa");
        testMap.put("b", "testb");

        System.out.println(testMap.get("a"));
        System.out.println(testMap.get("b"));
        System.out.println(testMap.get("c"));

        /**
         * 这里sleep4秒钟过后,
         * 缓存都失效,再get就会根据绑定的function去获得value放在map中了。
         */
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        /**
         * 看看这里的再输出,是不是就是新的值了!~
         */

        System.out.println(testMap.get("a"));
        System.out.println(testMap.get("b"));
        System.out.println(testMap.get("c"));
    }

}

参考:http://norther.iteye.com/blog/670414

http://guoliangqi.iteye.com/blog/657534

猜你喜欢

转载自san-yun.iteye.com/blog/1683560