bukkit java。util。ConcurrentModificationException错误
我最近在运行runnable时遇到了一个错误,runnable更新了矿车的位置Main.UvehicleLocation2
是一个HashMap
[22:36:59] [Craft Scheduler Thread - 607/WARN]: Exception in thread "Craft Scheduler Thread - 607"
[22:36:59] [Craft Scheduler Thread - 607/WARN]: org.apache.commons.lang.UnhandledException: Plugin CreativeControlByKubqoA v2.2.3 generated an exception while executing task 3019245
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:56)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1429)
at java.util.HashMap$KeyIterator.next(HashMap.java:1453)
at java.util.AbstractCollection.toArray(AbstractCollection.java:141)
at java.util.ArrayList.<init>(ArrayList.java:177)
at me.kubqoa.creativecontrol.tasks.VehiclesUpdateDB.run(VehiclesUpdateDB.java:19)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftTask.run(CraftTask.java:71)
at org.bukkit.craftbukkit.v1_9_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
... 3 more
以下是代码:
@Override
public void run() {
List<Location> locations1 = new ArrayList<Location>(Main.UvehiclesLocation2.keySet());
for (Location location : locations1) {
VehicleHelper.updateVehicle(location,Main.UvehiclesLocation2.get(location));
}
}
# 1 楼答案
Main.UvehiclesLocation2.keySet()
正在被更改,而您正在将其复制到新的数组列表中复制该实例时,您要么需要独占访问该实例(例如,使用
synchronized
块),要么可以将Main.UvehiclesLocation2
改为ConcurrentHashMap
From the Javadoc: