Какие знаешь варианты решения проблемы гонки потоков кроме mutex

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

Ответ

Использование synchronized блоков для атомарных операций:

synchronized(lockObject) {
    // critical section
}

Применение атомарных классов из java.util.concurrent.atomic:

AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();

Использование потокобезопасных коллекций:

ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();

Применение volatile для переменных, которые изменяются одним потоком, а читаются другими:

private volatile boolean flag;

Использование ThreadLocal для хранения переменных, уникальных для каждого потока:

ThreadLocal<Integer> threadId = new ThreadLocal<>();

Использование высокоуровневых примитивов из java.util.concurrent:

  • CountDownLatch
  • CyclicBarrier
  • Semaphore
  • Exchanger