Ответ
Директива @synchronized в Objective-C создает взаимное исключение (mutex) на основе переданного объекта-монитора. Когда она применяется к методу, этот метод становится критической секцией.
Принцип работы:
- Для обычного метода монитором выступает сам экземпляр объекта (
self). - Для статического (классового) метода монитором выступает объект класса.
- При входе в метод поток захватывает блокировку монитора.
- Если другой поток попытается войти в любой метод этого же экземпляра (или класса), защищенный
@synchronizedс тем же монитором, он будет заблокирован до освобождения монитора первым потоком.
Пример в Objective-C:
- (void)threadSafeMethod {
@synchronized(self) { // Блокировка на объекте 'self'
// Критическая секция.
// Только один поток может выполнять этот код для данного 'self'.
[self modifySharedResource];
} // Блокировка автоматически снимается здесь
}
Важные нюансы и аналоги в Swift:
- Уровень блокировки — объект, а не метод. Два разных метода, синхронизированные по
self, также будут блокировать друг друга. - Риск взаимной блокировки (deadlock): Если два потока захватывают мониторы
AиBв разном порядке. - В Swift нет прямой аналогии
@synchronized. Вместо нее используют:DispatchQueueс атрибутом.serialи барьерами (для чтения/записи).NSLock,os_unfair_lockдля точечной синхронизации.- Акторы (Actors) — современный Swift-способ изоляции состояния.