我有一组方法都与类对象同步(不能使用self,因为这个对象的多个实例可以在多个线程中使用)。其中一些方法调用类中的其他方法,这些方法也在类对象上同步。不知何故,这种方法有效并且不会导致我期望的死锁。
我认为testA会被阻止运行,因为testB已经锁定了类对象,但显然情况并非如此。
@synchronized正在做什么特别的事情,或者这是底层互斥锁的一个特性?
有效的示例代码:
- (NSUInteger)testA
{
@synchronized(self.class)
{
NSLog(@"Doing something in A");
}
return 1;
}
- (void)testB
{
@synchronized(self.class)
{
NSLog(@"Doing something in B");
NSLog(@"A returned: %i", [self testA]);
}
}
调用testB时输出为:
Doing something in B
Doing something in A
A returned: 1
答案 0 :(得分:11)
Mauricio的评论是正确的。来自TOCPL:
Objective-C同步功能支持递归和可重入代码。线程可以以递归方式多次使用单个信号量;阻止其他线程使用它,直到线程释放用它获得的所有锁;也就是说,每个
@synchronized()
块都会正常退出或通过异常退出。