2014-11-07 2 views
0

Обычно @synchronized(self) создает нечто вроде критической секции.В iOS @synchronized для двух методов одновременно?

Моя проблема в том, что у меня есть несколько функций, к которым следует обращаться только с одним потоком.

Но что будет делать приложение, если я напишу @synchronized(self) в каждом таком методе? Означает ли это, что один поток может использовать метод 1, а другой поток может использовать метод2? Если нет, то как правильно его реализовать?

+0

«У меня есть более чем одна функция, к которой должен быть доступен только один поток» - это действительная инструкция? я думаю, что мы не можем запускать сразу две функции из одного потока. – naresh

ответ

2

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

Объект, который вы передаете @synchronized, должен быть объектом, который вы хотите защитить от одновременных обновлений. Это может быть self или может быть имущество self. Например, рассмотрим следующую простую реализацию очереди:

@property (nonatomic,strong) NSMutableArray *qArray; 

-(void)append:(id)newObject { 
    @synchronized(self.qArray) { 
     [self.myArray addObject:newObject]; 
    } 
} 

-(id) head { 
    id ret=nil; 
    @synchronized(self.qArray) { 
     if (self.qArray.count >0) { 
      ret=self.qArray[0]; 
      [self.qArray removeObjectAtIndex:0]; 
     } 
    } 
    return ret; 
} 

В этом случае self.qArray является хорошим выбором для @synchronized как это объект модифицируется

+0

Вы могли бы объяснить, '' @synchronized (self) 'block' self' или каждый его изменяемый объект тоже? – Gargo

+0

Я думаю, что мой ответ немного запутан, когда я говорю «объект, который вы хотите защитить ...» - '@ synchronized' не блокирует объекты как таковые, он просто блокирует поток, пока он не сможет получить блокировку, где блокировка идентифицируется ссылкой на объект. Если бы у меня был код, к которому обращался/измененный qArray, у которого не было синхронизированного блока @, тогда этот код все равно может выполняться одновременно с другим потоком, который находится в блоке '@ synchronized', с возможным появлением возможного повреждения. Вам нужно быть добросовестным и гарантировать, что вы используете '@ synchronized' последовательно и везде, где это необходимо. – Paulw11

0

Фр кто

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

- (void)myMethod:(id)anObj 
{ 

     @synchronized(anObj) 
     { 
      // Everything between the braces is protected by the @synchronized directive. 
     } 
} 
+0

Итак, если я использую '@synchronized (self)' и 'self', это singleton, тогда' self' и все его изменяемые переменные защищены, и мне не нужно делать что-то дополнительное с этим кодом? Правильно ли это? – Gargo

0

Если доступ к двум (или более) функции через один нить. @synchronized не повлияет на ваш код. потому что ваша функция запускается синхронно без помощи блокировки.

+0

Многие потоки используют два разных метода одного класса, которые работают с одними и теми же изменчивыми объектами, но разными способами. – Gargo

+0

@synchronized просто создайте критический раздел, на основе которого вы передали объект, затем он блокирует код раздела. он не блокирует объект, который вы передали. например, @synchronized (objA) {objB.element1;}; если два потока обращаются к этому коду, если objA тот же, что и objB, может быть защита блоков. но потоки могут изменять элемент objA с небезопасным потоком. – franklin

Смежные вопросы