我在一个类方法中意外地使用了带有信号量self
的@synchronized
块。
+(void)someFunction {
@synchronized(self) {
/* some code */
}
}
这似乎是有效的代码,至少编译器没有给我任何不良反馈。我的问题是:这里的self
是什么?据我所知,@synchronized
块没有起作用,但它也没有崩溃。
我只是出于好奇而问。
我在一个类方法中意外地使用了带有信号量self
的@synchronized
块。
+(void)someFunction {
@synchronized(self) {
/* some code */
}
}
这似乎是有效的代码,至少编译器没有给我任何不良反馈。我的问题是:这里的self
是什么?据我所知,@synchronized
块没有起作用,但它也没有崩溃。
我只是出于好奇而问。
self
指的是类本身,而不是实例。在ObjC中,类本身也是对象。@synchronized
语法是一种编译器扩展,用于互斥量实现。我假设你理解它的作用。编译器将把它转换成其他东西,可能类似于临界区,因为它的CPU使用率较低。需要跟踪锁。该实现将使用一个对象来记录锁的状态,以保持其完整性(即锁不应被获取两次或解锁两次)。@synchronized(self)
中,对象不必是self
。它可以是任何Objective-C对象。请注意,单个@synchronized
块通常什么也不做(当你说它不起作用时,实际上它是正确行为)。但是当您在同一对象上有两个@synchronized
块时,只有一个块将同时执行,另一个块必须等待锁被解锁(即第一个块完成)。这有助于在多线程环境中保持同步。self
是调用该方法的类。例如,您可以使用 self
调用同一类的其他类方法。 [MyClass someFunction]
和 [self someFunction]
相当于递归调用 someFunction
。我确定 @synchronized
块按预期工作。