package org.apache.solr.util; import java.util.concurrent.ConcurrentHashMap; /** * @author Noble Paul (Noble.Paul@corp.aol.com) * Date: Jul 29, 2008 * Time: 10:40:07 AM */ public class ConcurrentFIFOCache { private ConcurrentHashMap map ; private int size; final Entry header ; final Entry tail ; public ConcurrentFIFOCache(int size ) { if(size < 1) throw new IllegalArgumentException("Size must be > 0"); this.size = size; this.map = new ConcurrentHashMap(size); header = new Entry(null,null); tail = new Entry(null, null); tail.after = header; header.before = tail; } public Object get(Object key){ return map.get(key).value; } public synchronized void put(Object key, Object value){ Entry e = new Entry(key, value); map.put(key, e); e.before = header.before; e.after = header; if(map.size()> size ){ map.remove(tail.after.key); tail.after.remove(); } } public synchronized Object remove(Object key){ Entry e = map.remove(key); e.remove(); return e.value; } class Entry { final Object key,value; volatile Entry after,before; public Entry(Object key,Object value) { this.key = key; this.value = value; } void remove() { if(before !=null) before.after = after; if(after !=null) after.before = before; } public int hashCode() { return key.hashCode(); } } }