@synchronized - 跳过而不是等待

@synchronized - skip instead of wait

我有一个 Objective-c 应用程序,其中有几个代码块,我只希望一个线程能够一次访问它。使用 @synchronized(self) 块可以很好地解决这个问题。

但是,我有一个块,如果另一个线程在 @synchronized 块之一中,我希望它 跳过 该块,而不是等待。有没有一种方法可以简单地测试 self(或者我的锁对象是什么)是否被另一个同步块持有?

// 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) {
    ...
}

当使用 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];
    }
}