ConcurrentModificationException - распределенная система Lamport - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь внедрить систему распределенных часов 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;
}

Как можно решить эту проблему?

Заранее спасибо

...