在@synchronized中阻止

时间:2011-09-14 12:31:02

标签: objective-c thread-safety objective-c-blocks

@synchronized内执行一个块似乎否定了锁定。

- (void)method {
    @synchronized(self) {
        if(ivar == nil) {
            ivar = [myBlock() retain];
        }
    }
}

实例变量ivar未写入任何其他位置。

我发现块myBlock有时会在我的应用程序中执行两次。

这怎么可能发生?如何避免这样做真正的工作锁?

2 个答案:

答案 0 :(得分:0)

也许你可以在街区内移动锁定。

答案 1 :(得分:0)

锁定工作正常,因为synchronized仅锁定线程,并且同一个线程正在访问该区域两次。问题是,在某些情况下myBlock在内部执行。