Параллелизм Java: я должен синхронизировать все Список и Карты? - PullRequest
0 голосов
/ 14 марта 2012

Итак, у меня есть класс SomeTask, который extends Thread, и он имеет поля Map и List. Что будет, если вы не выполните Collections.synchronizedXXX и у вас запущено несколько потоков SomeTask?

После вызова карты из базы данных (я использую объектную базу данных для непосредственного хранения POJO), нужно ли мне синхронизировать объект карты, возвращенный из этой базы данных?

Map SomeTasksOwnMap = Collections.synchronizedMap(MapReturnedFromDatabase);

Ответы [ 3 ]

1 голос
/ 14 марта 2012

Collections.synchronizedXXX требуется, когда 2 или более потоков обращаются к одной и той же карте / списку.

Если ваша задача не имеет доступа к другим задачам Карта / Список, синхронизировать их нет необходимости.

Пример.

  • Задача 1 создает список чисел, делимых ровно на 2.
  • Задача 2 составляет список чисел, делимых ровно на 3.

Эти две задачи имеют отдельные списки, которые не требуют синхронизации.

Пример требует синхронизации.

  • Задачи 1 и 2 рассчитывают числа и сохраняют их в общем списке.

Чтобы ответить на вопросы: «Каково будет поведение, если вы этого не сделаете», вы можете потерять одну из записей, если будет установлено, что оба потока захотят записать в индекс «x».

Вы также можете иметь нулевое значение в списке, так как размер массива был увеличен до того, как была выполнена запись в местоположение.

По сути, у вас будет противоречивое представление.

1 голос
/ 14 марта 2012

Нет.В вашем вопросе нет ничего, что предполагало бы, что требуется синхронизация, потому что, насколько я могу судить, каждый поток читает только данные внутри себя: синхронизация нужна вам только тогда, когда потоки обращаются к данным в других потоках.

SomeTask extends Thread плохой дизайн - он должен extends Runnable, затем использовать new Thread(new SomeTask()).start().

0 голосов
/ 14 марта 2012

... я должен синхронизировать все Список и Карты?

Нет, вы не должны.Синхронизация вещей, которые не нужны, это пустая трата ресурсов.И для вещей, которые действительно нуждаются в синхронизации, вы должны сделать это правильно.(И оболочки synchronizedXxx не всегда верны.)

Во-первых, вам необходимо определить структуры данных, которые будут видны нескольким потокам.Структуры данных, которые доказуемо ограничены потоками, вообще не нуждаются в синхронизации.

Во-вторых, вам нужно изучить способ использования структур данных, чтобы увидеть, достаточно ли оболочки synchronizedXxx.Например, эти оболочки не синхронизируют итерацию, и вы можете столкнуться с проблемами, если один поток изменяет коллекцию, а другой выполняет итерацию.

Наконец, вам нужно подумать о том, сильно ли синхронизированы структуры данных.используется разными темами.Оболочки synchronzedXxx могут привести к узким местам производительности, если структура данных интенсивно используется.Если это так, вам следует рассмотреть возможность использования одного из классов ConcurrentYyyy.

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