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