Парни, может любой давать простой практический пример LockSupport
& AbstractQueuedSynchronizer
использовать? Пример, данный в javadocs, является вполне напряженным.
Использование Semaphore
разрешения поняты подо мной.
Спасибо за любой ответ.
Если вы говорите об использовании механизма блокировки (или даже барьеров синхронизации), просто используйте java.util.concurrent.Lock
. Очевидное предложение - использовать ReentrantLock
, который делегирует Synch
. Синхронизация - это AQS, который, в свою очередь, использует LockSupport
.
Это все сделано для вас под одеялом.
Редактировать:
Нет, давайте рассмотрим практическое использование AbstractQueuedSynchronizer
(AQS).
Хотя конструкции параллелизма могут сильно различаться в использовании, все они могут иметь одни и те же базовые функции.
Т.е. При определенных условиях запаркуйте эту ветку. При каком-то другом условии разбудите нить.
Это очень широкий набор инструкций, но он делает очевидным, что большинству структур параллелизма потребуются некоторые общие функции, которые могли бы обрабатывать эти операции за них. Введите AQS. Есть пять основных препятствий для синхронизации.
ReentrantLock
ReadLock
WriteLock
Semaphore
CountDownLatch
Теперь все эти пять структур имеют очень разный набор правил при их использовании. Обратный отсчет CountdownLatch
может позволить нескольким потокам работать одновременно, но заставляет один (или несколько) потоков ждать, пока по крайней мере n число потоков обратится к указанной защелке.
ReentrantLock
заставляет только один поток одновременно входить в критический раздел и ставит в очередь все другие потоки, чтобы дождаться его завершения.
ReadLock
позволяет любому количеству потоков чтения в критическую секцию, пока не будет установлена блокировка записи.
Примеры можно продолжать, но общая картина заключается в том, что все они используют AQS. Это потому, что они могут использовать примитивные функции, которые предлагает AQS, и реализует более сложные функции поверх них. AQS позволяет вам припарковать и активировать потоки (при необходимости с прерыванием), но таким образом, чтобы вы могли поддерживать множество сложных функций.
AQS - замечательный класс для создания примитивов параллелизма, но он сложен и требует небольшого изучения, чтобы используйте его правильно. Я использовал его для нескольких вещей, таких как отложенная инициализация и простая быстрая многоразовая защелка .
Каким бы сложным он ни был, я не думаю, что AQS является особенно расплывчатым, в нем есть отличные javadocs, описывающие, как его правильно использовать.
они не предназначены для прямого использования в клиентском коде; больше для помощи в создании новых параллельных классов.