整理一下条件锁~
直接上代码:
- (void)testConditionLock
{
//构建条件锁,条件值为1
NSConditionLock *lock = [[NSConditionLock alloc]initWithCondition:1];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//线程1 传入9,与条件值不相等,无法正确进行加锁操作,会阻塞线程
[lock lockWhenCondition:9];
NSLog(@"11111");
sleep(1);
[lock unlock];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
//传入1,如果与条件的值相等,返回YES;如果不相等则返回NO,不会阻塞当前线程
if ([lock tryLockWhenCondition:1]) {
NSLog(@"22222");
NSLog(@"2加锁");
//解锁,并把条件值修改为4
[lock unlockWithCondition:4];
}else{
NSLog(@"2加锁失败");
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(2);
//传入4,如果与条件的值相等,则返回YES;不相等则返回NO,不会阻塞线程
if ([lock tryLockWhenCondition:4]) {
NSLog(@"33333");
//解锁
[lock unlock];
NSLog(@"3加锁");
}else{
NSLog(@"3加锁失败");
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(3);
//传入4,如果与条件的值相等,则返回YES;不相等则返回NO,不会阻塞线程
if ([lock tryLockWhenCondition:4]) {
NSLog(@"4444");
NSLog(@"4加锁");
//解锁,并把条件值改为9,此时线程1的条件锁可以正常加锁
[lock unlockWithCondition:9];
}else{
NSLog(@"4加锁失败");
}
});
}

加油~
网友评论