@synchronized()采用的参数是什么

时间:2014-03-18 11:58:15

标签: ios objective-c multithreading mutex synchronized

我知道@synchronized()的作用,但是......
有时我们有:

1- @synchronized(self)
2- @synchronized([MyClass class])
3- @synchrinized(myObj)

什么是差异,我应该传递给这个块的参数是什么?

2 个答案:

答案 0 :(得分:10)

来自documentation

  

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

所以这取决于你想要保护什么不被同时执行, 这三种情况都有申请。

例如,在

-(void)addToMyArray1:(id)obj
{
    @synchronized(self) {
        [self.myArray1 addObject:obj];
    }
}

-(void)addToMyArray2:(id)obj
{
    @synchronized(self) {
        [self.myArray2 addObject:obj];
    }
}

两个@synchronized块不能由两个线程调用同时执行 该方法在同一实例self)上,从而保护对同时访问 来自不同线程的数组。

但它也阻止了第一种方法的阻塞 与第二种方法同时执行的块执行,因为它们 使用相同的锁self。因此,对于更精细的锁定,您可以使用 不同的锁:

-(void)addToMyArray1:(id)obj
{
    @synchronized(self.myArray1) {
        [self.myArray1 addObject:obj];
    }
}

-(void)addToMyArray2:(id)obj
{
    @synchronized(self.myArray2) {
        [self.myArray2 addObject:obj];
    }
}

现在可以从不同的线程同时访问self.myArray1self.myArray2 仍然受到保护,但彼此独立。

上的锁可用于保护对全局变量的访问。 这只是用于演示目的的一个简单示例:

static int numberOfInstances = 0;

-(id)init
{
    self = [super init];
    if (self) {
        @synchronized([self class]) {
            numberOfInstances++;
        }
    }
}

答案 1 :(得分:-1)

@synchronized应该每次都传递相同的对象。所以@synchronized(self)会效果最好。