Java 代码生成并发修改异常
我有以下代码:Java 代码生成并发修改异常,java,android,concurrency,Java,Android,Concurrency,我有以下代码: public static void pauseAllTimers() { for(Timer timer : Timer.allTimers) { timer.pause(); } } 其中,Timer实例在一个线程内被添加和删除到allTimers(据我所知,除非我在监督代码中的某些内容) 为什么我的代码会产生并发修改异常?在从集合中删除时,您正在对集合进行迭代-假设pause()删除了计时器。不要这样做-
public static void pauseAllTimers() {
for(Timer timer : Timer.allTimers) {
timer.pause();
}
}
其中,Timer
实例在一个线程内被添加和删除到allTimers
(据我所知,除非我在监督代码中的某些内容)
为什么我的代码会产生并发修改异常?在从集合中删除时,您正在对集合进行迭代-假设pause()
删除了计时器。不要这样做-您在修改集合的同时仍在对其进行迭代,这是一种并发修改,即使只有一个线程
将计时器集复制到列表中,然后迭代:
List timers=new ArrayList(Timer.allTimers);
用于(计时器:计时器){
timer.pause();
}
当从集合中删除时,您正在对集合进行迭代-假设pause()
删除了计时器。不要这样做-您在修改集合的同时仍在对其进行迭代,这是一种并发修改,即使只有一个线程
将计时器集复制到列表中,然后迭代:
List timers=new ArrayList(Timer.allTimers);
用于(计时器:计时器){
timer.pause();
}
这是有道理的,但是在暂停方法期间,我没有删除或添加任何实例到allTimerlist。@LukeTaylor:那么当你说“在一个线程中向AllTimer添加和删除计时器实例的位置”时,是怎么做的?这是你自己的Timer
课程吗?(我不记得在java.util.Timer
上看到过allTimers
字段)很抱歉,我正在从pause方法的allTimerlist中删除一个实例。这是我在pause方法中调用的另一个方法。是的,这是我自己的定时器类,属于我正在编写的游戏引擎。谢谢你的回答。这是有道理的,但是在暂停方法期间,我不会删除或添加任何实例到allTimerlist。@LukeTaylor:那么当你说“在一个线程中向AllTimer添加和删除计时器实例的位置”-这是怎么做的?这是你自己的Timer
课程吗?(我不记得在java.util.Timer
上看到过allTimers
字段)很抱歉,我正在从pause方法的allTimerlist中删除一个实例。这是我在pause方法中调用的另一个方法。是的,这是我自己的定时器类,属于我正在编写的游戏引擎。谢谢你的回答。
List<Timer> timers = new ArrayList<Timer>(Timer.allTimers);
for (Timer timer : timers) {
timer.pause();
}