java - 需要审查:ConcurrentmodificationException 而 ReentrantLock 确保这是不可能的
问题描述
上下文:Github:第 20 期和Github:第 22 期
我有一个 ConcurrentModificationException,但我不知道去哪里找。该变量是私有的,并且只能在使用 ReentrantLock 锁定所有访问权限的同一类中访问。
在循环中,对象不会被删除(那么为什么会发生这个异常?)
这是一段分解的代码:
private static final TreeMap<Long, TrackerHolder> TRACKER_LIST = new TreeMap<>();
private static final ReentrantLock TRACKER_LIST_LOCK = new ReentrantLock();
public static void tickUntil(long time){
TRACKER_LIST_LOCK.lock();
boolean hasWork = true;
while(System.nanoTime() < time && hasWork) {
hasWork = false;
for(TrackerHolder holder : TRACKER_LIST.values()){ //This line is giving the error, indicating TRACKER_LIST is being modified somehow.
Tracker tracker = holder.getTracker();
if(tracker.needsTick()){
hasWork = true;
tracker.grantTick();
}
}
}
TRACKER_LIST_LOCK.unlock();
}
这是一个开源项目,您可以在此处访问(链接到当前时间点。)
java.util.ConcurrentModificationException: null
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1211) ~[?:1.8.0_191]
at java.util.TreeMap$ValueIterator.next(TreeMap.java:1256) ~[?:1.8.0_191]
at cf.terminator.tiquality.tracking.TrackerManager.tickUntil(TrackerManager.java:69) ~[TrackerManager.class:?]
at cf.terminator.tiquality.monitor.TickMaster.onServerTick(TickMaster.java:64) ~[TickMaster.class:?]
at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_2625_TickMaster_onServerTick_ServerTickEvent.invoke(.dynamic) ~[?:?]
at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) ~[ASMEventHandler.class:?]
at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:746) ~[EventBus.class:?]
at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:696) ~[EventBus.class:?]
at net.minecraftforge.fml.common.FMLCommonHandler.onPostServerTick(FMLCommonHandler.java:266) ~[FMLCommonHandler.class:?]
at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:712) ~[MinecraftServer.class:?]
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) [MinecraftServer.class:?]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
我正处于需要其他人来查看的地步。我也想了解这个 ConcurrentModificationException 来自哪里,以及将来如何防止它。我认为自己有能力编写非常高级的代码,但我可能在这里遗漏了一些东西。
感谢您的时间。
解决方案
推荐阅读
- java - Java HttpsURLConnection call rest web service and apply certificate programmatically
- elasticsearch - 如何根据 ElasticSearch 中某个字段中出现的子字符串的数量进行评分
- r - 查找 R 中每个变量类别的中位数
- android - 当我添加到 pubspec.yaml 时,firebase auth 出现问题
- javascript - 为什么javascript在作为参数或索引传入时将数组解析为字符串
- puppeteer - 带有 puppeteer 的服务器端屏幕截图?
- python - 如何用另一个字典更新 Pymongo 文档?
- spring-boot - 在 Spring Boot 中设置 liquibase.changelogSchemaName 属性
- pandas - 我成功地从数据框中的列返回计数,但是在尝试将结果导入列时得到 NaN 值
- python - 如何将 2D np 数组添加到 3D np 数组的前面?