线程锁线程安全

NSLock, NSRecursiveLock

2020-01-14  本文已影响0人  谌文

NSLock

这是一个低级别的锁。一旦获取锁,执行则进入临界区,且不会允许超过一个线程并行执行。释放锁则标记临界区的结束。

例 展示啦如何使用NSLock

@interface ThreadSafeClass ()
{
    NSLock *lock;
}
@end

- (instancetype)init {
    if (self = [super init]) {
        self->lock = [NSLock new];
    }
    return self;
}
- (void)safeMehod {
    [self->lock lock];
    /// 线程安全代码 2
    [self->lock unlock];
}

疑问:

1 为啥 NSLock必须在锁定的线程中进行解锁。
2 当 /// 线程安全代码 2中调用类中其他方法,其他方法也要加锁怎么办?。 重用[self->lock lock]; [self->lock unlock];?? 这是不行的,使用释放锁才能加加锁,一一对应的,那怎么办呢,接下来看下面这个文章

    [self->lock lock];
    /// 线程安全代码 2
    [self->lock unlock];

如以下只会打印0,1,

- (void)safeMehod {
    NSLog(@"0");
    [self->lock lock];
    NSLog(@"1");

    [self->lock lock];
    NSLog(@"2");

    /// 线程安全代码
    [self->lock unlock];
    NSLog(@"3");
}

NSRecursiveLock

在调用lock之前,NSLock必须先调用unlock。但正如名字所暗示的那样,
NSRecursiveLock允许在被解锁之前锁定多次。如果解锁次数与锁定的次数相匹配,则认为锁被释放,其他线程可以获取锁。
当类中有多个方法使用同一个锁进行同步时,且其中一个方法调用另一个方法时,NSRecursiveLock非常有用,例4-6展示了使用NSRecursiveLock的一个例子

例 使用NSRecursiveLock

@interface ThreadSafeClass ()
{
    NSRecursiveLock *lock;
}
@end

- (instancetype)init {
    if (self = [super init]) {
        self->lock = [NSRecursiveLock new];
    }
    return self;
}
- (void)safeMehod1 {
    [self->lock lock];
    [self safeMehod2];
    [self->lock unlock];
}

- (void)safeMehod2 {
    [self->lock lock];
    /// 线程安全
    [self->lock unlock];
}
上一篇 下一篇

猜你喜欢

热点阅读