Hardaqs
Что такое AQS (AbstractQueuedSynchronizer)?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
AQS — фреймворк в java.util.concurrent для построения synchronizer'ов (ReentrantLock, Semaphore, CountDownLatch, ReentrantReadWriteLock, FutureTask). Основан на FIFO очереди waiting threads + volatile int state.
// Схема (упрощённо)
// Подкласс определяет tryAcquire / tryRelease (exclusive)
// или tryAcquireShared / tryReleaseShared (shared)
class Mutex extends AbstractQueuedSynchronizer {
protected boolean tryAcquire(int arg) {
if (compareAndSetState(0, 1)) { // CAS
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
protected boolean tryRelease(int arg) {
setState(0);
return true;
}
}- Поток, не получивший доступ, добавляется в очередь и паркуется (
LockSupport.park); при освобождении — unpark следующего; stateиспользуется по-разному: вReentrantLock— 0/1 + owner, вSemaphore— permits, вCountDownLatch— счётчик, вRWLock— readers count + writer bit;- CAS для queue operations (enqueue/dequeue, race conditions);
- Использовать напрямую сложно — лучше готовые synchronizers (автор — Doug Lea).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.