Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios @synchronized()采用的参数是什么_Ios_Objective C_Multithreading_Mutex_Synchronized - Fatal编程技术网

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

Ios @synchronized()采用的参数是什么,ios,objective-c,multithreading,mutex,synchronized,Ios,Objective C,Multithreading,Mutex,Synchronized,我知道@synchronized()做什么,但是 有时我们有: 1-@同步(自) 2-@synchronized([MyClass类]) 3-@synchrinized(myObj) 区别是什么,我应该传递给这个块的参数是什么 @synchronized每次都应该传递相同的对象。因此@synchronized(self)的效果最好。来自: 传递给@synchronized指令的对象是唯一的 用于区分受保护块的标识符。如果您执行 两个不同线程中的前一个方法,传递不同的对象 对于每个线程上的anOb

我知道@synchronized()做什么,但是
有时我们有:

1-
@同步(自)

2-
@synchronized([MyClass类])

3-
@synchrinized(myObj)


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

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

来自:

传递给
@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.myArray1
self.myArray2
仍然受到保护,但相互独立

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

static int numberOfInstances = 0;

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

你应该通过@synchronized(self)类似的问题:。@Natarajan,为什么?总是?
@synchronize()
是一样的
NSLock
我猜。用于使其成为线程安全的,您应该确保不要猜测:)我在问@AnilThat应该传递什么参数,这取决于您想要保护什么。
@synchronized([MyClass class])
@synchronized(someObj)
@MartinR也有一些用例,是的,当您有一个单例时可能是这样?如果您有一个单例,这不会有什么区别,因为只有一个实例。不,这要视情况而定。如果为同一类的任何其他对象执行相同的代码将是一个问题,则需要在该类上进行同步。还要记住:“@synchronized”应该在尽可能短的时间内使用(所有在“@synchronized”之外的计算也是如此),并尽量避免在不同的对象上嵌套“@synchronized”语句,以避免死锁。最好通过临界部分,而不是每次都通过self,对吗?在这种情况下_obj@Basheer_CAD我不明白你的问题。什么是_obj?例如,我正在使用一个方法来更改_obj(由多个线程编写),最好使用@synchronized(_obj),然后在{…}内更改此对象。以防万一self在other@synchr.中用作标记。。阻止另一个线程?@Basheer\u CAD:是的,如果你有一个要保护的对象(如我回答中的数组),那么你可以锁定这个对象(实际上更简单,我已经相应地更新了答案)但可能有更复杂的情况(例如,需要保护的语句序列)需要专用锁。如果我理解,第一个示例是否同时保护array1和array2?