目录
NSLock
self.countLock = [[NSLock alloc] init];
- (void)__countMinus {
[self.countLock lock];
[super __countMinus];
[self.countLock unlock];
}
NSCondition
self.countLock = [[NSCondition alloc] init];
- (void)__countMinus {
[self.countLock lock];
[super __countMinus];
[self.countLock unlock];
}
- (IBAction)orderExec {
NSConditionLock *conditionLock = [[NSConditionLock alloc] initWithCondition:3];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[conditionLock lockWhenCondition:3];
NSLog(@"lxy:1");
[conditionLock unlockWithCondition:2];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[conditionLock lockWhenCondition:2];
NSLog(@"lxy:2");
[conditionLock unlockWithCondition:1];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[conditionLock lockWhenCondition:1];
NSLog(@"lxy:3");
[conditionLock unlockWithCondition:0];
});
}
Semaphore
- (IBAction)semaphoreOrder {
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务1");
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务2");
dispatch_semaphore_signal(sem);
});
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSLog(@"任务3");
});
}
读写锁
- (void)viewDidLoad {
[super viewDidLoad];
self.dataDic = [NSMutableDictionary new];
self.iQueue = dispatch_queue_create("lg", DISPATCH_QUEUE_CONCURRENT);
}
- (IBAction)moreReadSigleWrite:(id)sender {
for (int i = 0; i<10; i++) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
if (i == 5) {
[self lg_write:[NSString stringWithFormat:@"%d-name" ,i]];
} else {
[self lg_read];
}
});
}
}
- (NSString *)lg_read {
// 异步读取
__block NSString *ret;
//此处用同步,是因为有返回值。用异步返回值就不准确了
dispatch_sync(self.iQueue, ^{
// 读取的代码
ret = self.dataDic[@"name"];
});
NSLog(@"%@",ret);
return ret;
}
- (void)lg_write: (NSString *)name {
// 写操作
//用栅栏函数保证读写互斥
dispatch_barrier_async(self.iQueue, ^{
[self.dataDic setObject:name forKey:@"name"];
});
}
行者常至,为者常成!