首页

分享tomcat源码包中通过ConcurrentHashMap和WeakHashMap定义超简单线程安全缓存ConcurrentCache源码说明

标签:tomcat源码,ConcurrentHashMap,WeakHashMap,并发缓存,ConcurrentCache,自定义缓存     发布时间:2018-10-22   

一、前言

关于tomcat源码包中org.apache.el.util.ConcurrentCache线程安全缓存,基于java.util.concurrent.ConcurrentHashMap并发队列乐观锁控制,并对超过容器大小数据寄存在java.util.WeakHashMap弱引用MAP中(保证内存空间充足的情况,缓存超出容器大小的数据,不足的情况正常回收,不给jvm虚拟机增加空间压力)。

二、源码说明

package org.apache.el.util;@b@@b@import java.util.Map;@b@import java.util.WeakHashMap;@b@import java.util.concurrent.ConcurrentHashMap;@b@@b@public final class ConcurrentCache<K,V> {@b@@b@    private final int size;@b@@b@    private final Map<K,V> eden;@b@@b@    private final Map<K,V> longterm;@b@@b@    public ConcurrentCache(int size) {@b@        this.size = size;@b@        this.eden = new ConcurrentHashMap<K,V>(size);@b@        this.longterm = new WeakHashMap<K,V>(size);@b@    }@b@@b@    public V get(K k) {@b@        V v = this.eden.get(k);@b@        if (v == null) {@b@            v = this.longterm.get(k);@b@            if (v != null) {@b@                this.eden.put(k, v);@b@            }@b@        }@b@        return v;@b@    }@b@@b@    public void put(K k, V v) {@b@        if (this.eden.size() >= size) {@b@            this.longterm.putAll(this.eden);@b@            this.eden.clear();@b@        }@b@        this.eden.put(k, v);@b@    }@b@}