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



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

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

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

最新更新