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 подскажет развёрнутый ответ в реальном времени.