@interface NSConditionLock : NSObject <NSLocking> {
@private
void *_priv;
}
//使用条件初始化一个新创建的条件锁对象
- (instancetype)initWithCondition:(NSInteger)condition NS_DESIGNATED_INITIALIZER;
@property (readonly) NSInteger condition; //条件
//必须满足条件的情况下尝试获取锁,这个方法阻塞当前线程直到满足条件的情况下获取了锁
- (void)lockWhenCondition:(NSInteger)condition;
//试着获取锁,立即返回一个布尔值,标记是否获取成功。
- (BOOL)tryLock;
//判断条件是否满足:满足尝试获取锁,该方法会调用lockWhenCondition:beforeDate:,不满足也立即返回NO。
- (BOOL)tryLockWhenCondition:(NSInteger)condition;
//并不是当 Condition 符合条件时才解锁,而是解锁之后,修改 Condition 的值
- (void)unlockWithCondition:(NSInteger)condition;
尝试在指定时间前获取锁,返回个一布尔值,标记是否获取成功;阻塞线程的执行直到获取到锁或超时。
- (BOOL)lockBeforeDate:(NSDate *)limit;
//在指定时间前,且满足条件的情况下尝试获取锁,阻塞线程知道获取到锁或到时。
- (BOOL)lockWhenCondition:(NSInteger)condition beforeDate:(NSDate *)limit;
@property (nullable, copy) NSString *name NS_AVAILABLE(10_5, 2_0);
@end
相比NSLock多了一个condition属性,多了以condition为参数的获取锁的方法。
eg:
NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:3];
//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[lock lock];
NSLog(@"线程1");
sleep(3);
NSLog(@"线程1解锁");
[lock unlock];
});
//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
[lock lockWhenCondition:3];
NSLog(@"线程2");
NSLog(@"线程2解锁");
[lock unlock];
});
print:和NSLock的使用差不多