1.@synchronized
一般在创建单例对象的时候使用,多线程环境下创建线程是唯一的。
2.atomic
修饰属性的关键字,对被修饰对象进行原子操作(不负责使用)
@property(atomic) NSMutableArray *array;
//这样保证线程的安全性
self.array = [NSMutableArray array];
//不能保证线程安全的
[self.array addObject:obj];
3.OSSpinLock(自旋锁)
循环等待访问,不释放当前资源,用于轻量级数据访问(引用计数+1/-1操作)
4.NSLock(对象锁)
-(void)A{
[lock lock];
[self B];
[lock unlock];
}
-(void)B{
[lock lock];
//操作逻辑
[lock unlock];
}
//导致死锁
- 使用NSLock 对临界区加锁处理的时候,当前某个线程调用lock之后,获取得到锁
- 到B方法后,同一把锁又获取了一次,导致了死锁
//解决方案
通过递归锁NSRecursiveLock
5.NSRecursiveLock(递归锁)
-(void)A{
[recursiveLock lock];
[self B];
[recursiveLock unlock];
}
-(void)B{
[recursiveLock lock];
//操作逻辑
[recursiveLock unlock];
}
递归锁的特点就是重入
6.dispatch_semaphore_t(信号量)
dispatch_semaphore_create(1);
dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);
dispatch_semaphore_signal(semaphore);
网友评论