Synchronized
Суть
@synchronized(obj) { ... } — директива Objective-C: критическая секция, в которую одновременно может войти только один поток. Под капотом рантайм держит глобальную хеш-таблицу «объект → рекурсивный мьютекс» и вызывает objc_sync_enter(obj) / objc_sync_exit(obj) вокруг блока.
Свойства:
- Рекурсивный: тот же поток может войти повторно без дедлока.
- Exception-safe: лок освобождается при выходе из блока любым способом, включая выброс исключения.
- Медленный: поиск в глобальной таблице плюс рекурсивный мьютекс — заметно дороже
os_unfair_lock. - Ключ — любой объект; если ключ
nil, блок выполняется без лока (тихая ошибка). Синхронизация поselfобъединяет в один лок все секции класса, а внешний код может взять тот же лок и вызвать дедлок.
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep