mango中本地缓存源码

官方文档:http://www.jfaster.org/
我这个是基于2.0.1版本~

package org.jfaster.mango.util.local;

/**
 * @author ash
 */
public interface LoadingCache<K, V> {

  public V get(K key);

}


package org.jfaster.mango.util.local;

import java.util.concurrent.ConcurrentHashMap;

/**
 * @author ash
 */
public class DoubleCheckCache<K, V> implements LoadingCache<K, V> {

  private final CacheLoader<K, V> loader;
  private final ConcurrentHashMap<K, V> cache = new ConcurrentHashMap<K, V>();
  private final ConcurrentHashMap<K, Object> locks = new ConcurrentHashMap<K, Object>();

  public DoubleCheckCache(CacheLoader<K, V> loader) {
    this.loader = loader;
  }

  @Override
  public V get(K key) {
    V value = cache.get(key);
    if (value == null) {
      synchronized (getLock(key)) {
        value = cache.get(key);
        if (value == null) {
          value = loader.load(key);
          if (value != null) {
            cache.put(key, value);
          }
        }
      }
    }
    return value;
  }

  private Object getLock(K key) {
    Object lock = locks.get(key);
    if (lock == null) {
      lock = new Object();
      Object old = locks.putIfAbsent(key, lock);
      if (old != null) { // 已经存在lock
        lock = old;
      }
    }
    return lock;
  }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。