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

Bas*_*CAD 6 multithreading mutex objective-c synchronized ios

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

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

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

Mar*_*n R 10

文档:

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

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

例如,在

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

-(void)addToMyArray2:(id)obj
{
    @synchronized(self) {
        [self.myArray2 addObject:obj];
    }
}
Run Code Online (Sandbox Code Playgroud)

两个@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];
    }
}
Run Code Online (Sandbox Code Playgroud)

我们同时访问self.myArray1,并self.myArray2从不同的线程仍然受到保护,但互不影响.

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

static int numberOfInstances = 0;

-(id)init
{
    self = [super init];
    if (self) {
        @synchronized([self class]) {
            numberOfInstances++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)