@synchronized - 跳过而不是等待

时间:2015-02-21 21:40:55

标签: objective-c multithreading mutex

我有一个带有几个代码块的Objective-c应用程序,我只希望一个线程能够一次访问它。使用@synchronized(self)块可以正常工作。

但是,如果另一个线程位于其中一个@synchronized块中,而不是等待,我有一个块,我希望它跳过块。有没有办法简单地测试自己(或我的锁对象是什么)是否被另一个同步块保持?

// block 1 - wait until lock is available
@synchronized(self) {
    ...
}
...
// block 2 - wait until lock is available
@synchronized(self) {
    ...
}
...
// block 3 - wait until lock is available
@synchronized(self) {
    ...
}
...
// block 4 - skip if lock is not immediately available - no waiting!
howDoISkipIfLockIsNotAvailable(self) {
    ...
}

1 个答案:

答案 0 :(得分:5)

使用NSLockNSRecursiveLock代替@synchronized语法糖时,您可以实现的目标。它提供的关键功能是tryLock方法:

NSRecursiveLock *lock = [[NSRecursiveLock alloc] init];

[lock lock];
@try {
    // ... do synchronized stuff
}
@finally {
    [lock unlock];
}

if ([lock tryLock]) {
    @try {
        // do synchronized stuff if possible
    }
    @finally {
        [lock unlock];
    }
}