Java 需要检查:ConcurrentmodificationException而ReentrantLock确保这是不可能的

Java 需要检查:ConcurrentmodificationException而ReentrantLock确保这是不可能的,java,thread-safety,concurrentmodification,Java,Thread Safety,Concurrentmodification,背景:和 我有一个ConcurrentModificationException,但我不知道去哪里找。该变量是私有的,并且仅在同一个类中访问,在该类中,使用ReentrantLock锁定对该变量的所有访问 在循环中,对象不会被删除(那么为什么会发生此异常?) 这是一段详细的代码: private static final TreeMap TRACKER_LIST=new TreeMap(); 私有静态最终可重入锁定跟踪器_LIST_LOCK=new ReentrantLock(); 公共静态无效

背景:和

我有一个ConcurrentModificationException,但我不知道去哪里找。该变量是私有的,并且仅在同一个类中访问,在该类中,使用ReentrantLock锁定对该变量的所有访问

在循环中,对象不会被删除(那么为什么会发生此异常?)

这是一段详细的代码:

private static final TreeMap TRACKER_LIST=new TreeMap();
私有静态最终可重入锁定跟踪器_LIST_LOCK=new ReentrantLock();
公共静态无效(长时间){
TRACKER_LIST_LOCK.LOCK();
布尔hasWork=true;
while(System.nanoTime()
这是一个开源项目,您可以访问它(链接到当前时间点)

我现在需要其他人来检查这件事。我还想了解ConcurrentModificationException从何而来,以及将来如何防止它。我认为自己能够写出相当先进的代码,但是我可能在这里漏掉了一些东西。
感谢您抽出时间。

阅读代码,我想知道,调用grantTick是否可能会改变跟踪器的集合?鉴于锁是可重入的,因此可以在同一线程中“重新获取”:是否有可能“tracker.needsTick()或“tracker.grantTick()”导致对TrackerManager的回调。。。这会改变映射的状态?与此同时,一个快速修复方法(尽管性能热点)可能是在循环之前复制结构。我检查了grantTick()和needsTick()是否以任何方式更改集合。请注意,如果代码引发异常,则可能永远无法解锁
unlock
应该在
finally
块中。阅读代码,我想知道,调用grantTick是否可能实际更改跟踪器的集合?如果锁是可重入的,那么它可以在同一线程中“重新获取”:是否有机会使用“tracker.needsTick()或“tracker.grantTick()”导致回调TrackerManager。。。这会改变映射的状态?与此同时,一个快速修复方法(尽管性能热点)可能是在循环之前复制结构。我检查了grantTick()和needsTick()是否以任何方式更改集合。请注意,如果代码引发异常,则可能永远无法解锁<代码>解锁
应位于
最终
块中。
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]