Любой практический пример использования LockSupport и AbstractQueuedSynchronizer? - PullRequest
12 голосов
/ 22 июля 2010

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

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

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

Ответы [ 5 ]

15 голосов
/ 22 июля 2010

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

. Все это сделано для вас под прикрытием.

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

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

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

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

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

  • ReentrantLock
  • ReadLock
  • WriteLock
  • Semaphore
  • CountDownLatch

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

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

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

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

1 голос
/ 14 ноября 2011

2.7 релиз Disruptor использует LockSupport.parkNanos вместо Thread.sleep для уменьшения задержки:

http://code.google.com/p/disruptor/

1 голос
/ 23 июля 2010

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

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

1 голос
/ 22 июля 2010

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

0 голосов
/ 01 июня 2011

AFAIK, AbstractQueuedSynchronizer используется для управления переходами состояний.JDK использует его для расширения Sync, внутреннего класса для java.util.concurrent.FutureTask.Класс Sync управляет состояниями (READY, RUNNING, RAN и CANCELED) FutureTask и переходами между ними.

Это позволяет, как вы, возможно, знаете, FutureTask блокировать FutureTask.get () до тех пор, пока RANсостояние достигнуто, например.

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