tomcat中的ConcurrentCache

偶然查找代码的时候发现tomcat中有一个ConcurrentCache类。并发?缓存?我感兴趣的点了进去。
功能描述:用于缓存数据,数据量超过size可能过期旧数据。

代码挺简单的,其中eden为热点数据,longterm为长期数据,size为缓存大小。

  • 添加数据(put)添加到eden,超过缓存大小后将eden中的数据全部转移至longterm。此时在eden中没有儿longterm有的数据,由于是弱引用的,会在GC时回收掉。
  • 获取缓存(get)会先从eden中查找,没有数据再去查询longterm,如果longterm中有数据,则重新设置为热点数据(eden)。
    完整代码:
public final class ConcurrentCache {
    private final int size;
    private final Map eden;
    private final Map longterm;

    public ConcurrentCache(int size) {
        this.size = size;
        this.eden = new ConcurrentHashMap(size);
        this.longterm = new WeakHashMap(size);
    }

    public V get(K k) {
        V v = this.eden.get(k);
        if (v == null) {
            synchronized(this.longterm) {
                v = this.longterm.get(k);
            }

            if (v != null) {
                this.eden.put(k, v);
            }
        }

        return v;
    }

    public void put(K k, V v) {
        if (this.eden.size() >= this.size) {
            synchronized(this.longterm) {
                this.longterm.putAll(this.eden);
            }

            this.eden.clear();
        }

        this.eden.put(k, v);
    }
}

你可能感兴趣的:(tomcat中的ConcurrentCache)