Ios @synchronized()采用的参数是什么
我知道@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
有时我们有:
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?