Что это значит, когда мы говорим, что Hashtable или Vector синхронизированы? - PullRequest
7 голосов
/ 08 апреля 2010

Вопросы говорят сами за себя, просто интересно, в интервью, что бы вы сказали, когда они спрашивают вас: «Что это означает на практике при синхронизации Hashtable или Vectors?»

Ответы [ 4 ]

14 голосов
/ 08 апреля 2010

Практически это означает две вещи:

  1. Не используйте их, если вы не будете делиться ими между потоками (если не просто используете HashMap или ArrayList).
  2. Если вы делитесь ими между потоками, убедитесь, что политики синхронизации, которые они реализуют, на самом деле достаточны для обеспечения безопасности вашей программы (поскольку наличие некоторой синхронизации мало указывает на всестороннее параллельное поведение класса).
8 голосов
/ 08 апреля 2010

Это означает, что доступ к базовому массиву / коллекции (добавить, получить, установить, поместить, удалить и т. Д. И т. Д.) Синхронизирован. Это не может происходить одновременно. Фактически, весь доступ размещен в очереди «первым пришел-первым вышел» (FIFO). Только и если только если никто (читай: нет другого потока), кто в данный момент обращается к объекту, то следующий (поток) в очереди может получить к нему доступ.

3 голосов
/ 08 апреля 2010

Только один поток выполнения может изменить состояние контейнера в любой момент времени.

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

Оригинальные контейнеры Java, например, java.util.Vector и java.util.Hashtable, все были синхронизированы по соображениям безопасности. Но недостатком синхронизации доступа по умолчанию является то, что в тех случаях, когда синхронизация не нужна, снижается производительность синхронизации. Так что теперь Java поставляется с несинхронизированными контейнерами, например, ArrayList и HashMap.

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

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

Это может быть проблемой, если вы используете его в программе, которая использует только поток, потому что процесс проверки, кому принадлежит монитор (какой поток пытается его использовать), все равно будет выполняться, тратя драгоценное время на обработку.

Даже использование их с одним или несколькими потоками может быть менее производительным, чем использование несинхронизированной версии и синхронизация только сложных деталей.

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