All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jfaster.badger.cache.support.DoubleCheckCache Maven / Gradle / Ivy

The newest version!
package org.jfaster.badger.cache.support;

import java.util.concurrent.ConcurrentHashMap;

import org.jfaster.badger.cache.CacheLoader;
import org.jfaster.badger.cache.LoadingCache;


public class DoubleCheckCache implements LoadingCache {

    private final CacheLoader loader;

    private final ConcurrentHashMap cache = new ConcurrentHashMap();

    private final ConcurrentHashMap locks = new ConcurrentHashMap();

    public DoubleCheckCache(CacheLoader 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;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy