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