Что делает @synchronized () как одноэлементный метод в цели C? - PullRequest
80 голосов
/ 11 июня 2011

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

Ответы [ 6 ]

112 голосов
/ 11 июня 2011

Объявляет критическую секцию вокруг блока кода. В многопоточном коде @synchronized гарантирует, что только один поток может выполнять этот код в блоке в любой момент времени.

Если вы не знаете, что оно делает, то ваше приложение, вероятно, не является многопоточным, и вам, вероятно, не нужно его использовать (особенно если сам синглтон не является поточно-ориентированным).


Редактировать: Добавление дополнительной информации, которой не было в исходном ответе от 2011 года.

Директива @synchronized запрещает нескольким потокам вводить любую область кода, защищенную директивой @synchronized , относящейся к одному и тому же объекту . Объект, переданный директиве @synchronized, является объектом, который используется в качестве «блокировки». Два потока могут находиться в одной и той же защищенной области кода, если в качестве блокировки используется другой объект, и вы также можете защитить две совершенно разные области кода, используя один и тот же объект в качестве блокировки.

Кроме того, если вы передадите nil в качестве объекта блокировки, блокировка вообще не будет выполняться.

42 голосов
/ 11 июня 2011

Из документации Apple здесь и здесь :

Директива @synchronized - это удобный способ создания взаимных блокировок на лету в Objective-С кодом.Директива @synchronized делает то же, что и любая другая мьютексная блокировка - она ​​предотвращает одновременное получение одной и той же блокировки разными потоками.

Документация содержит обширную информацию по этому вопросу.Стоит потратить время на его прочтение, особенно если учесть, что вы используете его, не зная, что он делает.

25 голосов
/ 27 июля 2013

Директива @synchronized - это удобный способ создания взаимных блокировок на лету в коде Objective-C .

Директива @synchronized делает то же, что и любая другая блокировка мьютекса.- предотвращает одновременное получение разными потоками одной и той же блокировки.

Синтаксис:

 @synchronized(key) 
 { 
  // thread-safe code 
 }

Пример:

 -(void)AppendExisting:(NSString*)val
{
  @synchronized (oldValue) {
      [oldValue stringByAppendingFormat:@"-%@",val];
  }
}

Теперь вышеприведенный код идеально подходит для потоковsafe..Now Несколько потоков могут изменить значение.

Выше приведен лишь неясный пример ...

6 голосов
/ 24 февраля 2013

@ синхронизированный блок автоматически обрабатывает блокировку и разблокировку для вас . @synchronize у вас есть неявная блокировка, связанная с объектом, который вы используете для синхронизации. Вот очень информативное обсуждение этой темы, пожалуйста, следуйте Как @synchronized блокирует / разблокирует в Objective-C?

4 голосов
/ 18 мая 2013

Отличный ответ здесь:

Помогите понять метод класса, возвращающий синглтон

с дальнейшим объяснением процесса создания синглтона.

0 голосов
/ 08 января 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...