iOS 开发中用到的锁
2019-04-24 本文已影响0人
飞不越疯人院
开发中可能用过的锁
1. @synchronized()
作用是创建一个互斥锁; @synchronized(OC对象,一般用self) { //code }
创建一个互斥锁保护对象
确保同时只有一个线程在操作它;
能有效防止多线程抢夺资源造成的数据安全问题;但是会耗费大量CPU资源;
///如果不对getter方法加上@synchronized锁, 程序无法运行;
- (void)synchronizedLockCase {
for (int i = 0; i < 5; i ++) {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
if (i % 2==0) {
[self.dataArr addObject:@"ABC"];
}else {
[self.dataArr addObject:@"EFG"];
}
NSLog(@"%@___", [NSThread currentThread]);
});
}
}
#pragma mark getter
- (NSMutableArray *)dataArr {
@synchronized (self) {
if (!_dataArr) {
_dataArr = [NSMutableArray arrayWithCapacity:0];
}
return _dataArr;
}
}
2. NSLock
遵循 NSLocking 协议;同一线程不能多次调用lock
方法,否则会死锁;
#加锁
- (void)lock;
#解锁
- (void)unlock;
#不阻塞线程尝试加锁, 能成功返回YES, 否则返回NO
- (BOOL)tryLock;
#阻塞线程在指定的时间前尝试加锁, 成功返回YES, 否则返回NO;
- (BOOL)lockBeforeDate:(NSDate *)limit;