这个递归同步调用为什么不会死锁?

4
我有一组方法,它们都同步到类对象(不能使用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

6
锁通常是可重入的,因此如果同一个线程尝试两次获取同一个锁,它会像已经拥有该锁一样获得它。 - Maurício Linhares
1个回答

14

Mauricio的评论是正确的。来自TOCPL

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接