Я только что создал одноэлементный метод и хотел бы знать, что @synchronized()
делает эта функция , поскольку я использую его часто, но не знаю смысла.
источник
Я только что создал одноэлементный метод и хотел бы знать, что @synchronized()
делает эта функция , поскольку я использую его часто, но не знаю смысла.
Он объявляет критическую секцию вокруг блока кода. В многопоточном коде @synchronized
гарантирует, что только один поток может выполнять этот код в блоке в любой момент времени.
Если вы не знаете, что оно делает, то ваше приложение, вероятно, не является многопоточным, и вам, вероятно, не нужно его использовать (особенно если сам синглтон не является потокобезопасным).
Изменить: добавление дополнительной информации, которой не было в исходном ответе от 2011 года.
@synchronized
Директива предотвращает несколько потоков от входа любого участка кода , который защищен с помощью @synchronized
директивы со ссылкой на тот же объект . Объект, переданный в @synchronized
директиву, - это объект, который используется в качестве «блокировки». Два потока могут находиться в одной защищенной области кода, если в качестве блокировки используется другой объект, и вы также можете защищать две совершенно разные области кода, используя тот же объект, что и блокировка.
Кроме того, если вы проходите nil
в качестве объекта блокировки, никакой блокировки не будет.
@synchronized
он ничего не делает - вы остаетесь незащищенными. 2)@synchronized
работает медленно .@synchronized
.Из документации Apple здесь и здесь :
Документация предоставляет обширную информацию по этому вопросу. Стоит потратить время на его прочтение, особенно с учетом того, что вы использовали его, не зная, что он делает.
источник
@synchronized
Директива представляет собой удобный способ для создания мьютекс замки на лету в Objective-C код.@synchronized
Директива делает то , что любой другой замок мьютекс будет делать-он предотвращает разные потоки от приобретения такой же замок одновременно.Синтаксис:
@synchronized(key) { // thread-safe code }
Пример:
-(void)AppendExisting:(NSString*)val { @synchronized (oldValue) { [oldValue stringByAppendingFormat:@"-%@",val]; } }
Теперь приведенный выше код является полностью потокобезопасным ... Теперь несколько потоков могут изменять значение.
Вышеупомянутое - всего лишь непонятный пример ...
источник
@synchronized(val, oldValue) { ... }
?Блок @synchronized автоматически обрабатывает блокировку и разблокировку за вас . @synchronize у вас есть неявная блокировка, связанная с объектом, который вы используете для синхронизации. Вот очень информативное обсуждение этой темы, пожалуйста , следите за тем, как @synchronized lock / unlock в Objective-C?
источник
Отличный ответ здесь:
Помогите понять метод класса, возвращающий синглтон
с дальнейшим объяснением процесса создания синглтона.
источник
@synchronized
этоthread safe
механизм. Часть кода, написанная внутри этой функции, становится частьюcritical section
, в которой одновременно может выполняться только один поток.@synchronize
неявно применяет блокировку, тогда какNSLock
применяет ее явно.Это только обеспечивает безопасность потоков, но не гарантирует ее. Я имею в виду, что вы нанимаете для своей машины опытного водителя, но это не гарантирует, что машина не попадет в аварию. Однако вероятность остается ничтожной.
источник