Ответ 1
Да. Из документов (сейчас на пенсии):
Функция синхронизации Objective-C поддерживает рекурсивный и реентерабельный код. Поток может использовать один семафор несколько раз рекурсивным способом; другие потоки не могут использовать его до тех пор, пока поток не снимет все блокировки, полученные с его помощью; то есть каждый блок @synchronized() завершается нормально или через исключение.
Для обсуждения производительности с этим и другими методами синхронизации/блокировки, смотрите здесь.