@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) {
...
}
当使用 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];
}
}
我有一个 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) {
...
}
当使用 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];
}
}