Я пишу какое-то клиент-серверное приложение, где мне приходится иметь дело с несколькими потоками. У меня есть несколько серверов, которые посылают живые пакеты каждые несколько секунд. Эти серверы поддерживаются в ConcurrentHashMap, который содержит их конечные точки в паре с временем последнего живого пакета, полученного от соответствующего сервера.Безопасность потоков при повторении через параллельные коллекции
Теперь у меня есть поток, который должен «сортировать» все серверы, которые не отправили живые пакеты за определенное количество времени.
Я думаю, я не могу просто так сделать, не так ли?
for(IPEndPoint server : this.fileservers.keySet())
{
Long time = this.fileservers.get(server);
//If server's time is updated here, I got a problem
if(time > fileserverTimeout)
this.fileservers.remove(server);
}
Есть ли способ я могу обойти это без aquiring блокировки для всего цикла (что я тогда уважать в других потоках, а)?
Просто указывая, что вы не можете удалить элементы, используя упрощенный синтаксис каждого цикла. Вам нужно использовать итератор явно. – sjlee
yep, я понял это тоже ... Я вроде как набрал это, прежде чем на самом деле написал код ^^ – DeX3