使用方法:对于锁的使用大致分为以下几步:
- 创建锁
- 可选(对于pthread_mutex):设置锁的一些属性
- 加锁、解锁
- 可选:对于提供了释放锁的API,我们都应该释放资源
下面以几种锁为例子,主要掌握了加锁、解锁的思想,其他锁的使用都差不多。
-
os_unfair_lock(不安全的锁)
#import <os/lock.h> - (instancetype)init { self = [super init]; if (self) { self.lock = OS_UNFAIR_LOCK_INIT; } return self; } -(void)saleTicket { os_unfair_lock_lock(&_lock); [super saleTicket]; os_unfair_lock_unlock(&_lock); } 复制代码
-
OSSpinLock(自旋锁)
#import <libkern/OSAtomic.h> - (instancetype)init { self = [super init]; if (self) { self.lock = OS_SPINLOCK_INIT; } return self; } - (void)saleTicket { OSSpinLockLock(&_lock); [super saleTicket]; OSSpinLockUnlock(&_lock); } 复制代码
-
NSLock(其实是对pthread_mutex普通锁(PTHREAD_MUTEX_NORMAL等价于PTHREAD_MUTEX_DEFAULT)的封装)
- (instancetype)init { self = [super init]; if (self) { self.lock = [[NSLock alloc] init]; } return self; } -(void)saleTicket { [self.lock lock]; [super saleTicket]; [self.lock unlock]; } 复制代码
-
NSCondition(条件)
@interface NSConditionDemo () /** NSCondition:本质上是对pthread_mutext和pthread_cond_t的封装 */ @property(nonatomic, strong)NSCondition *condition; @property(nonatomic, strong)NSMutableArray *itemsArray; @end @implementation NSConditionDemo - (instancetype)init { self = [super init]; if (self) { self.condition = [[NSCondition alloc] init]; self.itemsArray = @[].mutableCopy; } return self; } -(void)saleTicketTest { dispatch_async(dispatch_get_global_queue(0, 0), ^{ for (int i = 0; i < 15; i++) { [[[NSThread alloc] initWithTarget:self selector:@selector(__addItem) object:nil] start]; [[[NSThread alloc] initWithTarget:self selector:@selector(__removeItem) object:nil] start]; } }); } - (void)__addItem { [self.condition lock]; [self.itemsArray addObject:@123]; NSLog(@"添加元素"); sleep(1); //添加元素后,会signal该条件 [self.condition unlock]; [self.condition signal]; } - (void)__removeItem { [self.condition lock]; if(self.itemsArray == 0) { ///如果条件被signal,那么就会加锁,继续执行代码。 ///如果条件没被signal,那么就会释放刚才已经获得的锁,然后休眠,等待条件被signal [self.condition wait]; } [self.itemsArray removeObject:@12]; NSLog(@"删除元素"); [self.condition unlock]; } @end 复制代码
-
pthread_mutex(recursive)(递归锁)
-
NSRecursiveLock(递归锁):其实是对pthread_mutex(PTHREAD_MUTEX_RECURSIVE)的封装
-
NSConditionLock(条件锁)
-
@synchoronized(递归锁)