LRUMap对于构建缓存或者连接池之类的技术经常用到,common-collections框架给了现成的实现,大家在不需要修改的情况下,直接用,好用且稳定。
一个cache的简单例子:
import org.apache.commons.collections.map.LRUMap;
import java.util.Collections;
public class SampleCache {
private static SampleCache instance = null;
private Map<Long, Integer> cache = null;
private static int maxLength = 100000;
private SampleCache () {
init();
}
public static SampleCache getInstance() {
if (instance == null) {
instance = new SampleCache ();
}
return instance;
}
private void init() {
LRUMap map = new LRUMap(maxLength);
this.cache = Collections.synchronizedMap(map);
}
}
=======解析LRUMap=======
参考http://blog.csdn.net/statckoverflow/article/details/18908647 , 下面例子直接copy自参考文章
LRUMap 的一个简单使用示例:
- public static void main(String[] args) {
- LRUMap lruMap = new LRUMap(2);
- lruMap.put("a1", "1");
- lruMap.put("a2", "2");
- lruMap.get("a1");//mark as recentused
- lruMap.put("a3", "3");
- System.out.println(lruMap);
- }
上面的示例,当增加”a3”值时,会淘汰最近最少使用的”a2”, 最后输出的结果为:
{a1=1,a3=3}
LRUMap的使用说明如下:
LRUMap的初始化时需要指定最大集合元素个数,新增的元素个数大于允许的最大集合个数时,则会执行LRU淘汰算法。 所有的元素在LRUMap中会根据最近使用情况进行排序。最近使用的会放在元素的最前面(LRUMap是通过链表来存储元素内容). 所以LRUMap进行淘汰时只需要删除链表最后一个即可(即header.after所指的元素对象)
那么那些操作会影响元素的使用情况:
1.put 当新增加一个集合元素对象,则表示该对象是最近被访问的
2. get 操作会把当前访问的元素对象作为最近被访问的,会被移到链接表头
注:当执行containsKey和containsValue操作时,不会影响元素的访问情况。
LRUMap也是非线程安全。在多线程下使用可通过Collections.synchronizedMap(Map)操
作来保证线程安全。