Синхронизация на уровне языка Objective C использует мьютекс, как NSLock
. С семантической точки зрения есть некоторые небольшие технические различия, но в основном правильно думать о них как о двух отдельных интерфейсах, реализованных поверх общей (более примитивной) сущности.
В частности, с NSLock
у вас есть явная блокировка, тогда как с @synchronized
у вас есть неявная блокировка, связанная с объектом, который вы используете для синхронизации. Преимущество блокировки на уровне языка заключается в том, что компилятор понимает ее, поэтому он может решать проблемы с областями видимости, но механически они ведут себя в основном одинаково.
Вы можете думать о @synchronized
как о переписывании компилятора:
- (NSString *)myString {
@synchronized(self) {
return [[myString retain] autorelease];
}
}
преобразуется в:
- (NSString *)myString {
NSString *retval = nil;
pthread_mutex_t *self_mutex = LOOK_UP_MUTEX(self);
pthread_mutex_lock(self_mutex);
retval = [[myString retain] autorelease];
pthread_mutex_unlock(self_mutex);
return retval;
}
Это не совсем правильно, потому что фактическое преобразование является более сложным и использует рекурсивные блокировки, но оно должно понять смысл.