Какие примитивы синхронизации могут гарантировать порядок пробуждения потоков

«Какие примитивы синхронизации могут гарантировать порядок пробуждения потоков» — вопрос из категории Многопоточность, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Android/Java для гарантированного порядка пробуждения потоков можно использовать:

  1. Fair Lock (ReentrantLock с fair=true)
    Гарантирует FIFO-порядок:
    ReentrantLock lock = new ReentrantLock(true); // fair lock
    lock.lock();
    try {
        // критическая секция
    } finally {
        lock.unlock();
    }
  1. Synchronized + wait()/notify()
    В рамках одного монитора порядок пробуждения не гарантирован, но можно реализовать свою очередь ожидания.

  2. Semaphore с fair=true
    Аналогично ReentrantLock:

    Semaphore sem = new Semaphore(1, true); // fair semaphore

Важно: даже с fair-режимом абсолютной гарантии нет из-за особенностей планировщика ОС, но это максимально близкое решение. Для строгого порядка лучше использовать отдельные очереди задач (например, HandlerThread).