Sobes.tech
Назад к вопросам
Senior
3

Какие способы синхронизации потоков в Java ты знаешь?

Компании, где спрашивали
EXPERA

Ответ от нейросети

sobes.tech AI

В Java существует несколько способов синхронизации потоков:

  • Ключевое слово synchronized — блокировка методов или блоков кода для обеспечения взаимного исключения.

  • Объекты Lock из java.util.concurrent.locks — более гибкий механизм блокировок, например, ReentrantLock, позволяющий пытаться захватить блокировку с таймаутом, проверять состояние и т.д.

  • Volatile — гарантирует видимость изменений переменной между потоками, но не обеспечивает атомарность.

  • Atomic-классы (AtomicInteger, AtomicReference и др.) — обеспечивают атомарные операции без блокировок.

  • Семафоры (Semaphore) — ограничивают количество потоков, одновременно выполняющих определённый участок кода.

  • CountDownLatch, CyclicBarrier — для координации потоков, ожидания событий.

  • Concurrent коллекции (ConcurrentHashMap, ConcurrentLinkedQueue и др.) — обеспечивают потокобезопасный доступ без внешней синхронизации.

Пример использования synchronized:

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

Выбор способа зависит от задачи: для простого взаимного исключения подходит synchronized, для более сложных сценариев — Lock или атомарные классы.