Использование break и return в Java synchronizedList выполняет нежелательное поведение - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в использовании synchronizedLists в Java, и я столкнулся с проблемой - я пытаюсь сделать что-то вроде этого

public void foo(List<String> list) {
   List<String> syncList = Collections.synchronizedList(list);
   synchronized(syncList) {
      Iterator<String> itr = syncList.iterator();
      while(itr.hasNext()) {
         String s = itr.next();
         if(s == null) {
            return;
         }
         doStuff();
      }
   }
}

Но я заметил, что когда я Запустите этот doStuff (), кажется, не запускается для каждого из ненулевых элементов в списке. Я попытался поэкспериментировать с обменом return на break и continue, и я обнаружил, что doStuff () также не запускается для ненулевых элементов списка с break. При продолжении для ненулевых элементов списка действительно запускается doStuff (), но так как continue просто пропускает следующую итерацию l oop, это делает эту операцию намного дороже, чем нужно.

Почему что происходит, и какой лучший обходной путь?

edit: Забыл добавить, что когда я последовательно запускаю это с return, он работает нормально.

1 Ответ

0 голосов
/ 08 апреля 2020

break выходит из l oop. Это заставляет выполнение перейти к первой строке кода за пределами l oop.

return, выходящей из функции, и, естественно, l oop, содержащейся в функции. Выполнение продолжается там, где была вызвана эта функция.

При продолжении для ненулевых элементов списка запускается doStuff (), но после продолжения просто переходит к следующей итерации l oop это делает эту операцию намного дороже, чем хотелось бы.

Я не понимаю - какая операция дороже, чем вы хотите?

В любом случае, здесь ничего не должно делать с синхронизацией или параллельным программированием. Использование Collections.synchronizedList и synchronized(syncList) бессмысленно: другой поток не сможет получить к ним доступ.

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