在iOS @synchronized一次2个方法?

时间:2014-11-07 05:20:58

标签: ios multithreading mutex synchronized critical-section

通常@synchronized(self)会创建类似关键部分的内容。

我的问题是我有多个功能,只能用一个线程访问。

但是如果我在每个这样的方法中编写@synchronized(self),应用程序会怎样做?这是否意味着一个线程可以使用method1而其他线程可以使用method2?如果没有,那么如何正确实现它?

3 个答案:

答案 0 :(得分:3)

@synchronized尝试获取传递给它的对象的锁定。如果获得锁定,则继续执行。如果锁不能被包含,那么线程就会阻塞,直到可以获得锁定。

传递给@synchronized的对象应该是您要防止同步更新的对象。这可能是self,也可能是self的属性。例如,请考虑以下简单队列实现:

@property (nonatomic,strong) NSMutableArray *qArray;

-(void)append:(id)newObject {
    @synchronized(self.qArray) {
        [self.qArray 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的不错选择,因为它是被修改的对象

答案 1 :(得分:0)

弗罗姆某人

传递给@synchronized指令的对象是用于区分受保护块的唯一标识符。如果在两个不同的线程中执行上述方法,则在每个线程上为anObj参数传递一个不同的对象,每个线程都将锁定并继续处理而不被另一个阻塞。但是,如果在两种情况下都传递相同的对象,则其中一个线程将首先获取锁定,另一个线程将阻塞,直到第一个线程完成关键部分。

- (void)myMethod:(id)anObj
{

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

答案 2 :(得分:0)

如果通过一个线程访问两个(或更多)函数。 @synchronized不会影响您的代码。因为你的函数在没有锁定帮助的情况下同步运行。