Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: synchronization, race condition, lock

Как исправить код с CountDownLatch и не-атомарным счётчиком (без AtomicInteger)?

Вопрос проверяет умение корректно синхронизировать доступ к общему ресурсу в многопоточной среде при использовании CountDownLatch.

Короткий ответ

Чтобы избежать состояния гонки при работе с не-атомарным счётчиком, используйте:

  • synchronized-блоки для синхронизации доступа к счётчику.

  • Лок на объекте, общем для всех потоков.

Длинный ответ

Проблема возникает, когда несколько потоков одновременно изменяют общий счётчик без синхронизации.

Пример некорректного кода:

int counter = 0;
CountDownLatch latch = new CountDownLatch(4);

for (int i = 0; i < 4; i++) {
    new Thread(() -> {
        counter++; // Небезопасно!
        latch.countDown();
    }).start();
}

latch.await();
System.out.println(counter); // Может вывести 1, 2, 3 или 4

Решение:

  1. Синхронизация через synchronized:

    Object lock = new Object();
    // ...
    synchronized (lock) {
        counter++;
    }
  2. Использование ReentrantLock:

    Lock lock = new ReentrantLock();
    // ...
    lock.lock();
    try {
        counter++;
    } finally {
        lock.unlock();
    }

Когда использовать:

  • Если нельзя заменить счётчик на AtomicInteger.

  • Когда требуется явный контроль над блокировками.

Уровень

  • Рейтинг:

    1

  • Сложность:

    6

Навыки

  • Java

    Java

Ключевые слова

#synchronization

#race condition

#lock

Подпишись на Java Developer в телеграм