Sobes.tech
Back to questions
Junior — Middle
59

Какое отличие существуют между использованием ключевого слова 'synchronized' для метода и для блока, синхронизирующего конкретный объект?

Companies where asked
ИннотехИннотех

Answer from AI

sobes.tech AI

Ключевое слово synchronized в Java можно использовать двумя способами: для метода и для блока кода.

  • Синхронизация метода:

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

    • Позволяет явно указать объект, монитор которого нужно захватить.
    • Это даёт более тонкий контроль: можно синхронизировать только часть метода и выбрать конкретный объект для блокировки.

Отличия:

  • Метод synchronized блокирует весь метод, блокировка всегда на this или классе.
  • Блок synchronized(obj) блокирует только указанный объект obj и только внутри блока.

Пример:

public class Example {
    public synchronized void syncMethod() {
        // блокируется this
    }

    private final Object lock = new Object();

    public void syncBlock() {
        synchronized(lock) {
            // блокируется lock
        }
    }
}