Что делает @synchronized() как одноэлементный метод в цели C?

Я только что создал метод singleton, и я хотел бы знать, что делает функция @synchronized(), поскольку я часто использую ее, но не знаю значения.

Ответ 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?

Ответ 6

@synchronized - механизм thread safe. Часть кода, написанная внутри этой функции, становится частью critical section, к которой может выполняться только один поток за раз.

@synchronize применяет блокировку неявно, тогда как NSLock применяет ее явно.

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