JUC, лежащий в основе AQS последовательности параллельного программирования Java
Когда дело доходит до интерфейса JUC, Lock, все определенно будут его использовать. Наиболее часто используется ReentrantReadWriteLock и так далее. В начале JUC эта статья сначала расскажет об интерфейсе Lock и API AQS, а затем объяснит взаимосвязь между Lock и AQS. Структура статьи:
- Блокировка, связанный с AQS API
- Связь между AQS и интерфейсом блокировки
1. Блокировка, API, связанный с AQS
Необходимо реализовать API, связанный с интерфейсом блокировки:
Реализуемый API, связанный с AQS: API, предоставляемые AQS программистам для вызова: Шаблонные методы, предоставляемые AQS:2. Связь между AQS и интерфейсом блокировки
Ну, после прочтения вышеприведенного API, или API, который лень читать вообще, все должны быть полны **, но это не имеет значения, позвольте мне объяснить связь между AQS (синхронизатором очереди) и интерфейсом Lock через картинка ниже.
Короче говоря: когда мы хотим реализовать класс реализации интерфейса Lock, мы должны полагаться на AQS (синхронизатор очереди), почему так, потому что синхронизатор очереди помогает нам поддерживать логику блокировки и освобождения потока, например, когда потоки конкурируют за блокировки, когда поток не конкурирует, он должен быть брошен в очередь FIFO.Когда поток, который получает блокировку, освобождает блокировку, он должен уведомить потоки в очереди, чтобы конкурировать. Подумайте об этом, все, если вы позволите себе поддерживать его, разве вы не устанете? ? Таким образом, JDK предоставляет нам AQS, который предоставляет некоторые низкоуровневые API, позволяет нам охватить их, а затем иметь несколько шаблонных API для вызова наших низкоуровневых API и поддержки очереди. Поэтому мы можем сосредоточиться только наЛогика получения блокировки и отказа от блокировки.И оставить нетКак уведомить другие потоки, когда поток получает блокировку и когда поток освобождает блокировкуКак поддерживать. Как показано на рисунке, начальная точка красной стрелки — это то, что нам предоставляет AQS.API шаблонов, API, который мы хотим реализовать, должен только вызывать API, связанный с состоянием (конец зеленой стрелки), предоставляемый AQS, чтобы отслеживать, получена ли блокировка. Наконец, API интерфейса блокировки вызывает метод шаблона или API, который мы реализуем для реализации семантики блокировки.будь осторожен:
- Интерфейс блокировки вызововПри снятии блокировки семантикаНе вызывайте API, который мы реализовали, API, такие как tryRelease, напрямую, а вызывайте API, связанный с выпуском, в методе шаблона, поскольку он поддерживает лежащий в основеУведомлять другие потоки о конкурирующих блокировкахсемантика.
- В реализации интерфейса Lock мы можем вызвать tryAcquire в реализованном нами API, потому что он возвращает без получения блокировки, а очередь, поддерживаемая шаблоном, и тайм-аут обслуживания шаблона не используются.
Эпилог
Хорошо, работа сделана.Hava a good day .В следующем выпуске мы настроим замок, чтобы использовать содержимое этой статьи.