在@synchronized部分内声明的块是否同步?

时间:2014-07-24 07:54:45

标签: objective-c objective-c-blocks synchronized

在实现惰性线程安全getter时,我遇到了一个有趣的(在我看来)情况,我必须使用@synchronized部分,在此部分中声明和调用块。以下是代码的简化版本:

- (void) someMethod
{
    @synchronized(self) {
        [self doSomethingWithCompletionBlock:^{
            // Are we synchronized here?
        }];
    }
}

我们是否在块内同步(自己)?如果是这样,块捕获(就内存管理而言)是否为自指针?

1 个答案:

答案 0 :(得分:2)

块本身不会同步。

但是,如果您在同一个线程上同步执行此块,那么它仍然会在现有的synchronized块内运行。

如果OTOH将块传递给另一个线程,它将不再同步。