Вы сравниваете глобальную блокировку (одну блокировку для всех экземпляров) с рекурсивной блокировкой уровня объекта (одна блокировка на экземпляр, которую можно получить несколько раз из одного и того же потока). Они, как правило, не взаимозаменяемы - они работают и защищают друг от друга очень сильно.
Хорошая новость заключается в том, что вы можете использовать pthread_mutex_t
в качестве рекурсивной блокировки, уникальной для каждого экземпляра, для достижения той же степени защиты, что и @synchronized
. Использование pthread_mutex_t
также значительно ускоряет получение блокировок.
Чтобы добиться того же эффекта, что и @synchronized
с использованием мьютекса pthread, объявите pthread_mutex_t gLock
в качестве переменной экземпляра, а затем инициализируйте его как рекурсивный мьютекс в -init
. Наконец, уничтожьте мьютекс в -dealloc
.
Конечно, под- и базовым классам может понадобиться доступ к этой блокировке, если они полагались на семантику @synchronized
, чтобы делать правильные вещи через иерархию объектов.
@synchronized
очень медленно по сравнению с рекурсивным мьютексом pthread (последний раз я проверял).