Вопрос проверяет понимание механизма синхронизации в объектно-ориентированных языках, а именно на каком объекте происходит блокировка при вызове нестатического 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) { ... }.
Class (т.е. Counter.class), что является другим монитором.Вывод: Нестатический synchronized метод следует использовать, когда необходимо обеспечить потокобезопасность операций над состоянием конкретного экземпляра объекта, и несколько потоков могут работать с этим экземпляром одновременно.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
JavaScript
Java
Ключевые слова
Подпишись на Java Developer в телеграм