← Назад к вопросам

Когда будешь использовать синхронизированный метод?

2.0 Middle🔥 131 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Использование синхронизированных методов

Синхронизированный метод — это метод, доступ к которому получает только один поток за раз. Используется для защиты общих ресурсов от одновременного доступа в многопоточной среде.

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

Синхронизированные методы используются в следующих сценариях:

  1. Защита состояния объекта — когда несколько потоков могут одновременно обращаться к полям объекта и изменять его состояние

  2. Обеспечение целостности данных — когда операция должна быть атомарной и не должна прерываться другими потоками

  3. Работа с общими ресурсами — при доступе к файлам, базам данных или другим ресурсам, где одновременный доступ вызовет проблемы

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

public class Counter {
    private int count = 0;
    
    // Синхронизированный метод — только один поток может вызвать одновременно
    public synchronized void increment() {
        count++;
    }
    
    public synchronized int getCount() {
        return count;
    }
}

Альтернативные подходы

// 1. Синхронизация только критической секции
public class Counter {
    private int count = 0;
    private final Object lock = new Object();
    
    public void increment() {
        synchronized(lock) {
            count++;
        }
    }
}

// 2. Использование AtomicInteger (рекомендуется для простых случаев)
public class Counter {
    private AtomicInteger count = new AtomicInteger(0);
    
    public void increment() {
        count.incrementAndGet();
    }
}

// 3. ReentrantLock для большего контроля
public class Counter {
    private int count = 0;
    private final ReentrantLock lock = new ReentrantLock();
    
    public void increment() {
        lock.lock();
        try {
            count++;
        } finally {
            lock.unlock();
        }
    }
}

Недостатки синхронизированных методов

  • Производительность — синхронизация замедляет выполнение из-за использования мьютекса
  • Deadlock — возможны взаимные блокировки при неправильном использовании
  • Гранулярность — синхронизируется весь метод, даже если нужна защита только части кода

Рекомендации

  • Для простых атомарных операций используй AtomicInteger, AtomicLong, AtomicReference
  • Для более сложной логики используй ReentrantLock с try-finally
  • Избегай синхронизации методов, если можно использовать Collections.synchronizedMap() или ConcurrentHashMap
  • Минимизируй время, проведённое в синхронизированном блоке
Когда будешь использовать синхронизированный метод? | PrepBro