代码之家  ›  专栏  ›  技术社区  ›  Troy

@synchronized-跳过而不是等待

  •  3
  • Troy  · 技术社区  · 11 年前

    我有一个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) {
        ...
    }
    
    1 回复  |  直到 11 年前
        1
  •  5
  •   Leo user370469    11 年前

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