Ответ
В Java есть несколько способов синхронизации:
- synchronized методы/блоки – самый простой способ. Блокирует доступ к объекту или методу для других потоков.
public synchronized void syncMethod() { ... }
// или
synchronized(obj) { ... }
- ReentrantLock – более гибкая альтернатива с возможностью прерывания, таймаутов и честной блокировки.
Lock lock = new ReentrantLock();
lock.lock();
try { ... } finally { lock.unlock(); }
- Atomic-классы (AtomicInteger и др.) – для атомарных операций без блокировок.
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
- Volatile – гарантирует видимость изменений между потоками, но не атомарность.
private volatile boolean flag;
- Semaphore, CountDownLatch, CyclicBarrier – высокоуровневые примитивы для управления потоками.
Выбор зависит от сценария: атомарность, производительность или сложная логика синхронизации.