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

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

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

有什么区别 ,我应该传递给这个块的参数是什么?

从文档 :

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

因此,它取决于您希望保护的内容不会同时执行,并且所有三种情况都有应用程序。

例如,在

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

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

但它也阻止第一种方法的块与第二种方法的块同时执行,因为它们使用相同的锁定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++; } } } 

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