Какой-либо практический пример использования LockSupport & AbstractQueuedSynchronizer?

Парни, может любой давать простой практический пример LockSupport & AbstractQueuedSynchronizer использовать? Пример, данный в javadocs, является вполне напряженным.

Использование Semaphore разрешения поняты подо мной.

Спасибо за любой ответ.

12
задан 3 revs 22 July 2010 в 18:05
поделиться

3 ответа

Если вы говорите об использовании механизма блокировки (или даже барьеров синхронизации), просто используйте java.util.concurrent.Lock . Очевидное предложение - использовать ReentrantLock , который делегирует Synch . Синхронизация - это AQS, который, в свою очередь, использует LockSupport .

Это все сделано для вас под одеялом.

Редактировать:

Нет, давайте рассмотрим практическое использование AbstractQueuedSynchronizer (AQS).

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

Т.е. При определенных условиях запаркуйте эту ветку. При каком-то другом условии разбудите нить.

Это очень широкий набор инструкций, но он делает очевидным, что большинству структур параллелизма потребуются некоторые общие функции, которые могли бы обрабатывать эти операции за них. Введите AQS. Есть пять основных препятствий для синхронизации.

  • ReentrantLock
  • ReadLock
  • WriteLock
  • Semaphore
  • CountDownLatch

Теперь все эти пять структур имеют очень разный набор правил при их использовании. Обратный отсчет CountdownLatch может позволить нескольким потокам работать одновременно, но заставляет один (или несколько) потоков ждать, пока по крайней мере n число потоков обратится к указанной защелке.

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

ReadLock позволяет любому количеству потоков чтения в критическую секцию, пока не будет установлена ​​блокировка записи.

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

15
ответ дан 2 December 2019 в 19:30
поделиться

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

Каким бы сложным он ни был, я не думаю, что AQS является особенно расплывчатым, в нем есть отличные javadocs, описывающие, как его правильно использовать.

1
ответ дан 2 December 2019 в 19:30
поделиться

они не предназначены для прямого использования в клиентском коде; больше для помощи в создании новых параллельных классов.

1
ответ дан 2 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: