通常@synchronized(self)
会创建类似关键部分的内容。
我的问题是我有多个功能,只能用一个线程访问。
但是如果我在每个这样的方法中编写@synchronized(self)
,应用程序会怎样做?这是否意味着一个线程可以使用method1而其他线程可以使用method2?如果没有,那么如何正确实现它?
答案 0 :(得分:3)
@synchronized
尝试获取传递给它的对象的锁定。如果获得锁定,则继续执行。如果锁不能被包含,那么线程就会阻塞,直到可以获得锁定。
传递给@synchronized
的对象应该是您要防止同步更新的对象。这可能是self
,也可能是self
的属性。例如,请考虑以下简单队列实现:
@property (nonatomic,strong) NSMutableArray *qArray;
-(void)append:(id)newObject {
@synchronized(self.qArray) {
[self.qArray addObject:newObject];
}
}
-(id) head {
id ret=nil;
@synchronized(self.qArray) {
if (self.qArray.count >0) {
ret=self.qArray[0];
[self.qArray removeObjectAtIndex:0];
}
}
return ret;
}
在这种情况下,self.qArray
是@synchronized
的不错选择,因为它是被修改的对象
答案 1 :(得分:0)
弗罗姆某人
传递给@synchronized
指令的对象是用于区分受保护块的唯一标识符。如果在两个不同的线程中执行上述方法,则在每个线程上为anObj参数传递一个不同的对象,每个线程都将锁定并继续处理而不被另一个阻塞。但是,如果在两种情况下都传递相同的对象,则其中一个线程将首先获取锁定,另一个线程将阻塞,直到第一个线程完成关键部分。
- (void)myMethod:(id)anObj
{
@synchronized(anObj)
{
// Everything between the braces is protected by the @synchronized directive.
}
}
答案 2 :(得分:0)
如果通过一个线程访问两个(或更多)函数。 @synchronized不会影响您的代码。因为你的函数在没有锁定帮助的情况下同步运行。