读书人

WXXR LRUMap的兑现

发布时间: 2012-09-02 21:00:34 作者: rapoo

WXXR LRUMap的实现
前言

实现LRU算法,注意观察者模式、并发(读写锁、线程池)的运用

核心类:LRUMap成员变量

LinkedHashMap<K,V> map —— 底层存放元素(key-value)的容器。

ConcurrentLinkedQueue<LRUMapEvictionListener<K,V>> listeners —— 监听器队列,存放注册到该LRUMap的所有监听器(通过LRUMap的addListener注册),具体监听器实现LRUMapEvictionListener接口,实现void objectEvicted(K key, V value)方法(对象逐出处理程序,详见? )。当执行LRUMap的evict、setCapacity、put操作时,会notify listener,并由线程池中的线程来遍历listeners执行各个监听器的处理程序(即objectEvicted)。

?

ExpirationProcessor exProcess —— 内部类,线程类(继承Thread,是个守护线程setDaemon(true)),唤作“阎王线程”。持有成员属性Map<Object,Long> expirations唤作“死亡手册”(放置了key和lastAccess最后访问时间)和long expireTime(构造阎王线程实例时候设置的存活时间)。“阎王线程”会不断地定时地检查死亡名单,如果名单中某个元素达到死亡时间(当前时间?- lastAccess >?expireTime),则将该元素从名单及容器中删除并notify listener做相应处理操作。

?

“阎王线程”何时新建、start呢?

在实例化LRUMap的时候,会根据设置的存活时间expireTime决定是否启动“阎王线程”,如果实例化LRUMap时不指定?expireTime 或者设置为0,则不会有人定期检查容器中的元素是否到了死亡时间了。

?

线程工厂:

?

?

后记

1.体会读写锁的使用

?

http://nemogu.iteye.com/blog/1409879

2.java.util和java.util.concurrent中集合类

?

3.实现LRUMap时为什么使用观察者模式

LinkedHashMap<K,V> map中的元素被逐出(Evicte)后,如果想对这个被逐出的对象做处理(比如close)或者做一些其他相关操作,使用观察者模式,可以在map中的元素被逐出时,调用观察者类(监听器类)。

参考

1.观察者模式?http://nemogu.iteye.com/admin/blogs/1407857

?

?

?

读书人网 >编程

热点推荐