这里就单独说一下NSCondition
首先看一下条件锁的几个方法:
NSCondition *codition=[[NSCondition alloc] init];
// 加锁,使用条件锁的时候要添加这句告诉线程我要上锁了
[codition lock];
// 告诉当前线程等待,不再继续执行
[codition wait];
// 告诉其他加条件锁的线程不用等待了,可以继续执行了
[codition signal];
// 解锁,这个要和lock成对出现。很好理解,有加锁必有解锁
[codition unlock];
下面我们写一个简单的程序来测试一下
//获取一个全局的并发队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.num=0;
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"队列1数字%ld---%@",(long)self.num,[NSThread currentThread]); // 打印当前线程
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.num=2;
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"队列2数字%ld---%@",(long)self.num,[NSThread currentThread]); // 打印当前线程
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.num=3;
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"队列3数字%ld---%@",(long)self.num,[NSThread currentThread]); // 打印当前线程
});
上面是三个并发队列,打印出来时无序的
![](https://img.haomeiwen.com/i3794267/b5afa166a6afe6a7.png)
现在我想让它按照2,1,3的顺序打印出来,就可以用到条件锁
下面来把代码稍微修改一下
//这里的代码是完整的,自己去声明一个num的整数类型,然后就可以复制下来,自定义一个方法,把它贴进去就可以测试了
NSCondition *codition=[[NSCondition alloc] init];
self.num=0;
//获取一个全局的并发队列
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[codition lock];
while (self.num!=2) {
[codition wait];
}
self.num=1;
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"队列1数字%ld---%@",(long)self.num,[NSThread currentThread]); // 打印当前线程
[codition signal];
[codition unlock];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[codition lock];
while (self.num==0) {
self.num=2;
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"队列2数字%ld---%@",(long)self.num,[NSThread currentThread]); // 打印当前线程
[codition signal];
}
[codition wait];
[codition unlock];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[codition lock];
while (self.num==1) {
self.num=3;
[NSThread sleepForTimeInterval:2]; // 模拟耗时操作
NSLog(@"队列3数字%ld---%@",(long)self.num,[NSThread currentThread]); // 打印当前线程
}
[codition wait];
[codition unlock];
});
然后运行打印,顺序正好是2,1,3.如果还有怀疑的话,可以多运行几次打印
![](https://img.haomeiwen.com/i3794267/ea2892c640fd61fb.png)
上面有锁的代码是完整的,可以直接复制,demo我就不贴了。
如果你看了这篇文章也理解了话,就帮忙点个赞吧!
网友评论