Как бороться с ConcurrentModificationException

Я получаю исключение ConcurrentModificationException из моего таймера восстановления. Я использую поток, чтобы уменьшить значения каждую секунду, как это:

public class CoolDownTimer implements Runnable {
    @Override
    public void run() {
        for (String s : playerCooldowns.keySet()) {
            playerCooldowns.put(s, playerCooldowns.get(s) - 20);
            if (playerCooldowns.get(s) <= 0) {
                playerCooldowns.remove(s);
            }
        }
    }

}

Так что каждую секунду это должно уменьшить время восстановления каждого игрока на 20, но проблема в том, что я получаю CME каждые пару часов во время работы программы, особенно когда много людей в сети. Как мне сделать так, чтобы, если он все еще изменял список, он ожидал, пока текущая операция не была выполнена, и создал своего рода очередь изменений? Спасибо! Вот трассировка стека:

2012-06-18 20:59:05 [WARNING] Task of 'SurvivorsClasses' generated an exception
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:839)
at java.util.HashMap$KeyIterator.next(HashMap.java:874)
at me.zachoooo.survivorclasses.CoolDownManager$CoolDownTimer.run(CoolDownManager.java:13)
at org.bukkit.craftbukkit.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:126)
at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:533)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:459)

Строка 13 - начало цикла for ...

Ответы на вопрос(3)

Ваш ответ на вопрос