Каким должен быть лучший способ в приложении iOS, чтобы предотвратить изменение переменной экземпляра объектом, пока другой ее использует? Следует ли использовать директиву @synchronized(self)
?
Заранее спасибо
Каким должен быть лучший способ в приложении iOS, чтобы предотвратить изменение переменной экземпляра объектом, пока другой ее использует? Следует ли использовать директиву @synchronized(self)
?
Заранее спасибо
Если вы хотите, чтобы объект был заблокирован, чтобы ни один из двух потоков не использовал его одновременно, @synchronize - это один из способов. Но это не делает его потокобезопасным.
Вы также можете использовать GCD (Grand Central Dispatch) для тех же
Каким должен быть лучший способ в приложении iOS, чтобы предотвратить изменение переменной экземпляра объектом, пока другой использует его?
Хороший старый замок, например pthread_mutex
; вы также можете использовать обертку Objective-C этого (например, NSLock
и NSRecursiveLock
). @synchronized
также относится к этой категории, но это механизм наивысшего уровня, упомянутый здесь.
Конечно, превосходные параллельные решения, как правило, в большей степени связаны с изменениями в дизайне, потоке программ, в пользу неизменности и т.д. Все еще будут случаи, когда взаимное исключение/блокировка предпочтительнее или требуется.
К сожалению, чистый ObjC/ Cocoa испытывает недостаток в этой области - разработка высокоэффективной параллельной программы с использованием технологий ObjC и Cocoa является гораздо более сложной задачей, чем это должно быть (или должно быть).
Должно ли быть достаточным использование директивы @synchronized (self)?
Для простых случаев это достаточно. Это уровень объекта Рекурсивная блокировка.
Однако он довольно медленный, по сравнению с другими вариантами взаимного исключения.
Я не думаю, что @synchronized
многое для него, кроме:
@synchronized
удобен, но поскольку он имеет высокую стоимость, его следует использовать разумно.
Если единственная цель - иметь доступ к
self.myString; //getter
и
self.myString=aString; //setter
Лучший способ - объявить его как атомный, например:
@property (atomic, strong) NSString* myString;
Это гарантирует, что в многопоточной среде установка и получение myString по потоку 1 защищена от потока 2, что-то делает с ней.