SSp*_*oke 3 java dictionary get linkedhashmap lru
错误看起来像这样
Exception in thread "Thread-1" java.lang.NullPointerException
at java.util.LinkedHashMap$Entry.remove(LinkedHashMap.java:332)
at java.util.LinkedHashMap$Entry.recordAccess(LinkedHashMap.java:356)
at java.util.LinkedHashMap.get(LinkedHashMap.java:304)
at Server.getLastFinishedCommands(Server.java:9086)
at Server.processPacket(Server.java:484)
at PacketWorker.run(PacketWorker.java:34)
at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)
里面getLastFinishedCommands
我用
public List<CCommand> getLastFinishedCommands(UserProfile player) {
List<CCommand> returnList = new ArrayList<CCommand>();
if(!finishedCommands.containsKey(player.myWebsitecmd-1)) {
getSavedState(player);
return null;
}
try { //<-- added this try/catch so it doesn't happen again.
//Get commands.
CCommand cmd;
long i;
long startIndex = player.myWebsitecmd;
long endIndex = startIndex+LIMIT_COMMANDS;
for(i = startIndex; i <= endIndex; i++) {
cmd = finishedCommands.get(i); //<-- this is line 9086
if(cmd == null) {
return returnList;
}
returnList.add(cmd);
}
} catch(Exception e) {} //<-- added this try/catch so it doesn't happen again.
return returnList;
}
Run Code Online (Sandbox Code Playgroud)
我想制作一个自动删除旧条目的地图,所以我使用了这个片段
public static <K, V> Map<K, V> createLRUMap(final int maxEntries) {
return new LinkedHashMap<K, V>(maxEntries*3/2, 0.7f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
return size() > maxEntries;
}
};
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它
public static int final MAX_COMMANDS_QUEUE = 5000;
public Map<Long, CCommand> finishedCommands = createLRUMap(MAX_COMMANDS_QUEUE);
Run Code Online (Sandbox Code Playgroud)
显然,这是某种 CocurrentModifcationException ,在与多个线程一起使用时会发生。但是为什么它会在内部崩溃,有人知道我如何像 CocurrentHashMap 一样使用它吗?我试图解决这个问题,而不是仅仅在整个getLastFinishedCommands
函数周围放置一个 try/catch 。
我想要一个可以清除旧垃圾但仍保留至少 5000 个键/值条目的 Map。
根据堆栈跟踪,我假设代码尝试从索引中删除该值,该索引的项目已被另一个线程删除。NPE
这使得它在访问引用的属性时抛出null
。也许,您应该尝试同步集合
从文档LinkedHashMap
请注意,此实现不是同步的。如果多个线程同时访问链接哈希图,并且至少有一个线程在结构上修改了该图,则必须进行外部同步。这通常是通过同步一些自然封装地图的对象来完成的。如果不存在这样的对象,则应使用 Collections.synchronizedMap 方法“包装”映射。最好在创建时完成此操作,以防止意外地不同步访问地图:
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2075 次 |
最近记录: |