@synchronized块是否保证释放锁?

时间:2011-10-12 05:47:32

标签: objective-c macos cocoa

假设这些是实例方法,并调用-run

时间self发布时-run上的锁定是否会返回?

...
- (void)dangerous {
    @synchronized (self) {
        [NSException raise:@"foo" format:@"bar"];
    }
}

- (void)run {
    @try { [self dangerous]; }
    @catch (NSException *ignored) {}
}
...

3 个答案:

答案 0 :(得分:10)

@synchronized(obj) { code }块实际上等同于

NSRecursiveLock *lock = objc_fetchLockForObject(obj);
[lock lock];
@try {
    code
}
@finally {
    [lock unlock];
}

虽然这方面的任何特定方面实际上只是实现细节。但是,无论控件如何退出块,@synchronized块都可以保证释放锁。

答案 1 :(得分:4)

是的,是的。

self锁定将在您的进程从@synchronized (self) {}阻止后退出。

答案 2 :(得分:4)

是的,当-dangerous返回时(即使是异常),锁定被释放。 @synchronized添加了一个隐式异常处理程序来释放互斥锁。