Блокировка переменной экземпляра в Objective-C

Каким должен быть лучший способ в приложении iOS, чтобы предотвратить изменение переменной экземпляра объектом, пока другой ее использует? Следует ли использовать директиву @synchronized(self)?

Заранее спасибо

Ответ 2

Каким должен быть лучший способ в приложении iOS, чтобы предотвратить изменение переменной экземпляра объектом, пока другой использует его?

Хороший старый замок, например pthread_mutex; вы также можете использовать обертку Objective-C этого (например, NSLock и NSRecursiveLock). @synchronized также относится к этой категории, но это механизм наивысшего уровня, упомянутый здесь.

Конечно, превосходные параллельные решения, как правило, в большей степени связаны с изменениями в дизайне, потоке программ, в пользу неизменности и т.д. Все еще будут случаи, когда взаимное исключение/блокировка предпочтительнее или требуется.

К сожалению, чистый ObjC/ Cocoa испытывает недостаток в этой области - разработка высокоэффективной параллельной программы с использованием технологий ObjC и Cocoa является гораздо более сложной задачей, чем это должно быть (или должно быть).

Должно ли быть достаточным использование директивы @synchronized (self)?

Для простых случаев это достаточно. Это уровень объекта Рекурсивная блокировка.

Однако он довольно медленный, по сравнению с другими вариантами взаимного исключения.

Я не думаю, что @synchronized многое для него, кроме:

  • удобство для разработчика, чтобы ввести (может иметь плохие побочные эффекты) и
  • симметрия (это гарантирует, что разблокировка соответствует блокировке), что значительно уменьшает вероятность тупика по сравнению с альтернативами (очень хороший атрибут).

@synchronized удобен, но поскольку он имеет высокую стоимость, его следует использовать разумно.

Ответ 3

Если единственная цель - иметь доступ к

self.myString; //getter

и

self.myString=aString; //setter

Лучший способ - объявить его как атомный, например:

@property (atomic, strong) NSString* myString;

Это гарантирует, что в многопоточной среде установка и получение myString по потоку 1 защищена от потока 2, что-то делает с ней.