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
?
?
?