互斥锁:多任务操作中,同时运行的多个任务可能需要访问同一个资源,那么线程中就有这么一把锁,限制对共享资源的访问。互斥锁只有两种状态,上锁和不上锁。强调原子性和唯一性。在IOS中存在着NSSpinLock,NSLock,单一信号的信号量,pthread都可以实现互斥锁。
条件锁:条件锁强调的是条件等待而不是互斥,条件锁会阻塞当前线程,直到某个条件成立才会继续向下执行。NSCondition和信号量都可以实现条件锁。
NSMutableArray * products = [[NSMutableArray alloc] init];
NSCondition * condition = [[NSCondition alloc] init];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[condition lock];
while ([products count] == 0) {
NSLog(@"wait for product");
[condition wait];
}
[products removeObjectAtIndex:0];
NSLog(@"custom a product");
[condition unlock];
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[condition lock];
[products addObject:[[NSObject alloc] init]];
NSLog(@"produce a product");
[condition signal];
[condition unlock];
});
上面这个例子是线程1想等待products的count大于0的时候继续向下走,移除products里的数据,执行顺序是这样的,首先进入线程1,此时products的count等于0,condition wait,当前线程1停止执行,进入线程2,product添加一个对象,之后执行condition signal, condition wait处会接到信号,继续执行while循环,此时products等于1,跳出循环,删除products中对象。
这里可能会有一些疑问,其实 [condition lock]
和[condition unlock]
相当于是一对互斥锁,[condition wait]
会使当前线程等待,并且unlock,[condition signal]
之后[condition wait]
也不会马上执行,会等待[condition unlock]
才会执行。[condition wait]
和[condition signal]
和信号量有点像,都是可以向[condition wait]
出线程发送信号,判断是否执行,信号量也可以算作条件锁。