Компромиссы между использованием встроенного в Java механизма параллелизма и утилит, представленных в java.util.concurrent - PullRequest
0 голосов
/ 28 марта 2011

Каковы компромиссы между использованием встроенного в Java механизма параллелизма и утилит (например, ReentrantLocks), представленных в java.util.concurrent

Ответы [ 4 ]

4 голосов
/ 28 марта 2011

Существует два основных различия:

  • Классы java.util.concurrent представляют более высокий уровень абстракции и проверенные реализации конкретных концепций.Вы могли бы реализовать большинство или все эти концепции, используя только синхронизацию, но это было бы больше кода, больше работы и намного, намного более подверженных ошибкам.
  • Некоторые из этих классов основаны на элементарных аппаратных операцияхи установите) вместо синхронизации, которая работает лучше, чем синхронизация в условиях сильной (но не экстремальной) конкуренции.
2 голосов
/ 28 марта 2011

Это приходит на ум:

  1. «Синхронизированная» функция является языковой конструкцией и имеет специальное управление потоком для входа и выхода из блоков, тогда как «util.concurrent» должен подчиняться правиламлюбого другого объекта.Это повлечет за собой некоторую когнитивную нагрузку для программистов.

  2. Интерфейсы и реализации "util.concurrent" могут определять свои собственные уникальные поведения (такие как честность или отдельные блокировки чтения / записи), поэтомупространство для улучшения производительности в определенных ситуациях.

  3. Классы "util.concurrent.atomic" могут обеспечивать поддержку на аппаратном уровне для команд сравнения и обмена , которыевключить алгоритмы без блокировок и без ожидания, которые могут иметь лучшую производительность в некоторых приложениях.

1 голос
/ 28 марта 2011

Преимущества synchronized:

  • Очевидно, что просто использовать блок (или метод) synchronized проще со стороны синтаксиса, и вы не можете забыть шаг unlock().

Преимущества Lock:

  • С явными объектами Lock, с другой стороны, вы можете иметь не вложенные защищенные блоки - например, когдаитерируя по связанному списку, вы всегда можете заблокировать следующий элемент списка и только после этого разблокировать предыдущий.

  • Объект блокировки позволяет блокировать непрерывные, блокируемые и не прерываемые-блокирование получения блокировки, в то время как синхронизированный блок позволяет блокировать только непрерывную блокировку.

  • Существуют другие реализации блокировки, допускающие различные стратегии блокировки (например, ReadWriteLock).

1 голос
/ 28 марта 2011

Нет компромиссов, есть только подводные камни.

Почти никто не использует wait (), notify () и notifyAll () для реализации управления параллелизмом, если только они не пишут какую-то конструкцию, недоступную в java.util.одновременно.Это очень трудно понять, даже для Дуга Ли (автора книги по параллельному программированию в Java и JSR-166).

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

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