В Java, что предпочтительнее: синхронизированный метод или синхронизированный блок?

«В Java, что предпочтительнее: синхронизированный метод или синхронизированный блок?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Синхронизированный блок обычно предпочтительнее из-за гибкости и меньшей гранулярности блокировки.

Ключевые различия:

  • Синхронизированный метод блокирует весь объект (для нестатических методов) или весь класс (для статических). Это может привести к избыточной блокировке и снижению производительности.
  • Синхронизированный блок позволяет выбрать объект-монитор и ограничить синхронизацию только критической секцией кода.

Пример синхронизированного блока:

public void doSomething() {
    // Несинхронизированный код
    synchronized(this) { // или любой другой объект-монитор
        // Критическая секция
    }
    // Другой несинхронизированный код
}

Преимущества блока:

  1. Лучшая производительность: Меньшая область блокировки уменьшает contention (состязание).
  2. Гибкость: Можно использовать разные мониторы для разных секций.
  3. Точный контроль: Синхронизируется только код, который в этом действительно нуждается.

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