Cache is more complicated than you imagine.Basically,it's unmeaningful to discuss cache without concrete business scenario,such as data size.
You'd better make it clear what is the problem your solution will fix.
However, for your simple class,
1. How does your application module use this cache?
2. Have you considered the performance issue? Coz I found you always locked the whole cache object,put or get operation. 

解决方案 »

  1.   

    没看明白楼主想干什么。
    2个Map把值倒来倒去的。
    recycling 貌似是enduring 的备份。
    enduring 比初始化值大了就清空,清空之前放入备份的recycling 。
    recycling 超过2倍的初始化值就清空,然后把enduring 再备份一下。
    最后提供了清空跟toString方法。额对了,楼主在put和get方法上加上了同步,那为什么不直接用线程安全的Map呢?
    楼主你到底想干嘛呢?没接触过LRUMap,不明觉个厉吧!
    顺便接点分升星
      

  2.   

    表示没看懂你的这个cache 
    给你点建议,你看看mybatis源码里面有缓存,那里面利用了装饰模式,实现了各种缓存,包括lur
    lur是根据LinkedHashMap实现的,你可以看看。
      

  3.   

    虽然没有使用过LRUMap ,可是看楼主的代码有以下建议:
    1. new ConcurrentHashMap 会好一点
    2. 取的时候不要上锁
    3. 存进去的数据设置过期时间,不要以最大容量作为清除的条件。每次取数据的时候判断一下过期了没有,如果过期了就从容器里面移走。
    4. 不要使用synchronized锁定方法,可以在方法里面锁定指定对象。我看你的方法全部加了synchronized , 比如有一个线程正在调用get,那么另一个线程就不能调用set了。缓存主要是为了高效,这样做没有起到高效的做用。纯属个人意见,如有不对大家相互交流。
      

  4.   

    enduring 区域存放的是常用的数据
    recycling 区域存放的是待回收的区域当enduring 满了以后,将所有数据放入recycling 等待回收。如果数据被频繁使用即调用get方法获取,那么该数据会从recycling 回到enduring 中,这样可以保证enduring 中的数据是经常被使用或者新放入的数据。至于那个超出2倍最大容量是为了清除掉长期没有使用的数据。
    线程安全的Map在这种情况下不适用。
      

  5.   

    1.就我写的这个代码来说ConcurrentHashMap 不太适用。
    2.取数据如果不上锁多线程环境下会产生数据错误,比如一个线程正在更新这个数据。
    3.时间这个我也考虑过,但如果单靠取出数据的时候检查时间会造成Map无限增加,还得用个线程来定时检查(这种我也写了一个)。
    4.synchronized的性能其实也没那么差,这个用读写锁改写一下也很方便。
    多谢指教了
      

  6.   


    LRU那个我现在用的就是。现在就是想自个弄个缓存玩玩。
      

  7.   

    1.就我写的这个代码来说ConcurrentHashMap 不太适用。
    2.取数据如果不上锁多线程环境下会产生数据错误,比如一个线程正在更新这个数据。
    3.时间这个我也考虑过,但如果单靠取出数据的时候检查时间会造成Map无限增加,还得用个线程来定时检查(这种我也写了一个)。
    4.synchronized的性能其实也没那么差,这个用读写锁改写一下也很方便。
    多谢指教了1,2. ConcurrentHashMap 就能解决多线程存取数据不同步的。
    3. 不需要线程定期检查,只要取的时候检查一下并做处理就可以了。时间跟最大容量同时使用应该不错。
    4. synchronized 没有锁超时,使用lock 可以指定超时时间,要不然比较容易发生死锁。
      

  8.   

    LRU是Least recently used,最近最少使用。
    你这个实现有点简单啊
    http://www.cnblogs.com/-OYK/archive/2012/12/05/2803317.html
      

  9.   

    所以叫SimpleCache,至于我写的这玩意到底算不算的上lru都不好说