62,629
社区成员
发帖
与我相关
我的任务
分享
import java.util.HashMap;
import java.util.Map;
public class SimpleCache {
private Map enduring = new HashMap();
private Map recycling = new HashMap();
private int maxCapacity;
public SimpleCache(int maxCapacity) {
this.maxCapacity = maxCapacity;
}
public synchronized Object get(String key) {
Object value = enduring.get(key);
if (value == null) {
value = recycling.remove(key);
if (value != null) {
put(key, value);
}
}
return value;
}
public synchronized void put(String key, Object value) {
if (enduring.size() >= maxCapacity) {
if (recycling.size() >= (maxCapacity * 2)) {
recycling.clear();
}
recycling.putAll(enduring);
enduring.clear();
}
enduring.put(key, value);
}
public synchronized void clear() {
enduring.clear();
recycling.clear();
}
@Override
public String toString() {
return enduring.toString() + "\r\n" + recycling.toString();
}
}
所以叫SimpleCache,至于我写的这玩意到底算不算的上lru都不好说
多谢指教了
[/quote]
1,2. ConcurrentHashMap 就能解决多线程存取数据不同步的。
3. 不需要线程定期检查,只要取的时候检查一下并做处理就可以了。时间跟最大容量同时使用应该不错。
4. synchronized 没有锁超时,使用lock 可以指定超时时间,要不然比较容易发生死锁。
LRU那个我现在用的就是。现在就是想自个弄个缓存玩玩。
多谢指教了
2个Map把值倒来倒去的。
recycling 貌似是enduring 的备份。
enduring 比初始化值大了就清空,清空之前放入备份的recycling 。
recycling 超过2倍的初始化值就清空,然后把enduring 再备份一下。
最后提供了清空跟toString方法。
额对了,楼主在put和get方法上加上了同步,那为什么不直接用线程安全的Map呢?
楼主你到底想干嘛呢?没接触过LRUMap,不明觉个厉吧!
顺便接点分升星