@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.myArray1
和self.myArray2
的同时访问仍然受到保护,但彼此独立。
类上的锁可用于保护对全局变量的访问。 这只是用于演示目的的一个简单示例:
static int numberOfInstances = 0; -(id)init { self = [super init]; if (self) { @synchronized([self class]) { numberOfInstances++; } } }
@synchronized应该每次都传递相同的对象。 所以@synchronized(self)最好用。