1. @synchronized(id anObject),(最简单的方法)
会自动对参数对象加锁,保证临界区内的代码线程安全
直接
@synchronized(self) {
}
2. NSLook
关键测试代码如下:
static NSLock *lock = nil;
if (!lock) {
lock = [[NSLock alloc] init];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
FDLog(@"线程A,准备好");
[lock lock];
FDLog(@"线程A lock, 请等待");
[NSThread sleepForTimeInterval:3];
FDLog(@"线程A 执行完毕");
[lock unlock];
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
FDLog(@"线程B,准备好");
[lock lock];
FDLog(@"线程B lock, 请等待");
[NSThread sleepForTimeInterval:1];
FDLog(@"线程B 执行完毕");
[lock unlock];
});
3. NSConditionLock,条件锁
id condLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
//生产者
while(1) {
[condLock lockWhenCondition:NO_DATA];
[condLock unlockWithCondition:HAS_DATA];
}
//消费者
while(1) {
[condLock lockWhenCondition:HAS_DATA];
[condLock unlockWithCondition:NO_DATA];
}
4. NSRecursiveLock 递归锁这部分没太研究
- (void)reverseDebug:(NSUInteger )num lock:(NSRecursiveLock *)lock{
[lock lock];
if (num<=0) {
FDLog(@"结束");
return;
}
FDLog(@"加了递归锁, num = %ld", num);
[NSThread sleepForTimeInterval:0.5];
[self reverseDebug:num-1 lock:lock];
[lock unlock];
}
- (IBAction)NSRecursiveLock:(id)sender {
static NSRecursiveLock *lock = nil;
if (!lock) {
lock = [[NSRecursiveLock alloc] init];
}
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self reverseDebug:5 lock:lock];
});
}
5. NSDistributedLock,分布锁
NSDistributedLock,分布锁,文件方式实现,可以跨进程
用tryLock方法获取锁。
用unlock方法释放锁。
如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。
本人自建的一个iOS交流群165332140,欢迎各位大神进群交流指导。