Я пытаюсь внедрить систему распределенных часов Lamport, и у меня возникают проблемы, когда дело доходит до списка, в котором я храню полученные и отправленные петиции. Конечно, в этом списке будут проблемы с параллелизмом, поскольку его используют как потоки, отвечающие за внешнюю, так и входящую связь, но я не могу избежать исключения.
Исключение возникает в разных местах, но я буду только опубликовать одну функцию в качестве ссылки. Я попытался синхронизировать и функцию, и список, но я все еще получаю исключение, и я понятия не имею, почему:
private synchronized int getMyRequestedClock(String process) {
LinkedList<LamportRequest> lamportRequest = parent.getLamportQueue();
synchronized (lamportRequest){
for (LamportRequest l : lamportRequest){ //here is the exception caused
if (l.getProcess().equals(process)){
return l.getClock();
}
}
}
return 0;
}
Я видел много сообщений о том, что обычно это происходит при удалении элемента из список, пока вы его повторяете: перебираем коллекцию, избегая исключения ConcurrentModificationException при удалении объектов в al oop
Я изменил свой код удаления, чтобы использовать Iterator, но я все еще получаю исключение. Далее следует моя текущая функция удаления без Итератора, так как она не решила проблему:
public synchronized void releaseRequest(String releaseProcess) {
synchronized (lamportQueue){
lamportQueue.removeIf(lr -> lr.getProcess().equals(releaseProcess));
}
//debug prints for myself in order to check that the queue values are correct
System.out.println();
for (LamportRequest lr : lamportQueue){
System.out.println("[LAMPORT (remove)]" + lr.toString());
}
removed = true;
}
Как можно решить эту проблему?
Заранее спасибо