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

时间:2012-01-21 21:29:19

标签: objective-c locking mutex deadlock

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

1 个答案:

答案 0 :(得分:11)

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

  

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