这个递归同步调用如何不是死锁?

Ben*_*ron 3 mutex deadlock locking objective-c

我有一组所有同步到类对象的方法(不能使用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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用testB时输出为:

Doing something in B
Doing something in A
A returned: 1
Run Code Online (Sandbox Code Playgroud)

Jos*_*ell 12

Mauricio的评论是正确的.来自TOCPL:

Objective-C同步功能支持递归和可重入代码.线程可以以递归方式多次使用单个信号量; 阻止其他线程使用它,直到线程释放用它获得的所有锁; 也就是说,每个@synchronized()块都会正常退出或通过异常退出.