我有一个带有几个代码块的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) {
...
}
答案 0 :(得分:5)
使用NSLock
或NSRecursiveLock
代替@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];
}
}