Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: synchronized, monitor, lock, thread safety, Java

На чем синхронизируется нестатический метод?

Вопрос проверяет понимание механизма синхронизации в объектно-ориентированных языках, а именно на каком объекте происходит блокировка при вызове нестатического synchronized метода.

Короткий ответ

Нестатический synchronized метод в Java синхронизируется на объекте, у которого он вызывается (на экземпляре класса this). Это означает, что два потока не могут одновременно выполнять synchronized методы одного и того же экземпляра объекта. Синхронизация обеспечивает потокобезопасность, предотвращая одновременное изменение состояния объекта разными потоками.

Длинный ответ

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

На чем происходит синхронизация?

Для нестатического synchronized метода монитором является сам объект, на котором вызывается метод (то есть this). Если два потока пытаются вызвать любой synchronized метод одного и того же экземпляра объекта, один из них будет заблокирован до тех пор, пока первый не освободит монитор, завершив выполнение метода.

Пример и применение

Этот механизм применяется для защиты данных объекта от состояния гонки (race condition). Рассмотрим простой класс счетчика:

public class Counter {
    private int value = 0;

    // Нестатический synchronized метод
    public synchronized void increment() {
        value++; // Эта операция теперь атомарна
    }

    public synchronized int getValue() {
        return value;
    }
}

Если несколько потоков работают с одним экземпляром Counter, вызовы increment() будут выполняться последовательно, гарантируя корректный итоговый счет. Синхронизация на уровне метода эквивалентна синхронизации на блоке кода с использованием synchronized(this) { ... }.

Важные нюансы

  • Синхронизация происходит на экземпляре, а не на классе. Два разных объекта одного класса не блокируют друг друга.
  • Статические synchronized методы синхронизируются на объекте Class (т.е. Counter.class), что является другим монитором.
  • Слишком широкое использование synchronized может привести к снижению производительности из-за блокировок.

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Java

    Java

Ключевые слова

#synchronized

#monitor

#lock

#thread safety

#Java

Подпишись на Java Developer в телеграм