首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个递归同步如何调用而不是死锁?

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

Stack Overflow用户
提问于 2012-01-21 21:29:19
回答 1查看 2.6K关注 0票数 4

我有一组方法,它们都与类对象同步(不能使用self,因为这个对象的多个实例可以在多个线程中使用)。其中一些方法调用类中的其他方法,这些方法也在类对象上同步。不知何故,这是可行的,并不会导致我期望的死锁。

我假设testA将被阻止运行,因为testB已经锁定了类对象,但显然并非如此。

这是@synchronized正在做的特殊事情,还是底层互斥锁的一个特性?

工作的示例代码:

代码语言:javascript
复制
- (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时,输出如下:

代码语言:javascript
复制
Doing something in B
Doing something in A
A returned: 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-21 21:37:40

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

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8956857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档