Этот вопрос проверяет понимание механизма синхронизации потоков в Java/Kotlin.
synchronized блокирует доступ к коду или объекту для других потоков, пока текущий поток не завершит выполнение. Это предотвращает гонки данных (race conditions) и обеспечивает потокобезопасность.
1. Принцип работы:
Поток, входящий в synchronized-блок, получает эксклюзивную блокировку (монитор) объекта.
Другие потоки блокируются, пока первый поток не выйдет из блока.
2. Способы использования:
Синхронизированный метод:
public synchronized void increment() {
counter++; // Безопасно для многопоточности
}Эквивалентно блокировке по this.
Синхронизированный блок:
void myMethod() {
synchronized(lockObject) { // Явное указание объекта-монитора
// Критическая секция
}
}3. Пример проблемы без синхронизации:
int counter = 0;
void unsafeIncrement() {
counter++; // Не атомарная операция!
}При параллельном выполнении нескольких потоков результат может быть некорректным.
4. Пример с synchronized:
private final Object lock = new Object();
int counter = 0;
void safeIncrement() {
synchronized(lock) { // Гарантирует атомарность
counter++;
}
}Вывод:synchronized — это базовый механизм для защиты общих ресурсов в многопоточной среде, но он может снижать производительность из-за блокировок.