Перебор коллекции в многопоточной среде: ConcurrentModificationException - PullRequest
0 голосов
/ 10 декабря 2018

Я получаю ConcurrentModificationException, поскольку этот код доступен нескольким потокам одновременно:

public void flush(Audit... audits) {
   // Copy first them on memory
   this.pendingAudits.addAll(Arrays.asList(audits));

   for (Iterator<Audit> it = this.pendingAudits.iterator(); it.hasNext();) {
       // Do something
       it.remove();
   }
}

Я получаю итератор для pendingAudits и удаляю каждый элементв то же время другие потоки могут добавлять некоторые другие проверки.

Как решить это элегантно?

1 Ответ

0 голосов
/ 10 декабря 2018

Быстрое решение состоит в том, чтобы обернуть каждый доступ к this.pendingAudits в synchronized:

sychronized(this.pendingAudits) {
   this.pendingAudits.addAll(Arrays.asList(audits));

   for (Iterator<Audit> it = this.pendingAudits.iterator(); it.hasNext();) {
       // Do something
       it.remove();
   }
}

Чистый эффект будет состоять в том, что в любой момент времени только один поток может выполнять синхронизированный блок.Это может стать узким местом, если код часто выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...