- iOS都有哪些锁:synchronized 、atomic、oSSpinLook、NSLock、dispatch_semaphore_t
- synchronized
例如创建单例使用 + (instancetype)sharedInstance
{
static LockTest * shareLockTest = nil;
//锁
@synchronized (self) {//创建单例队形使用
if (!shareLockTest) {
shareLockTest = [[LockTest alloc] init];
}
}
return shareLockTest;
}
//扩展GCD创建单例
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
shareLockTest = [[self alloc] init];
});
- atomic 修饰属性关键字,对被修饰对象进行原子操作(不负责使用)
例如:
@property (atomic,strong)NSMutableArray * array;
[NSMutableArray array] 安全的,
[array addObject:]是不安全
- oSSpinLook 自旋锁,
SpinLook_t是“忙等”的锁。
循环等待访问(whele),不释放当前资源,用于轻量级数据访问
例如: int类型的引用计数加1减1操作
- NSLock
[NSLock lock] [NSLock unlock] 重入会死锁 可以使用递归锁解决
*NSRecursiveLock 递归锁
[NSRecursiveLock lock] [NSRecursiveLock unlock]
- dispatch_semaphore_t 信号量
1:dispatch_semaphore_create(0) => 创建一个信号量
内部结构体
struct semaphore{
int Value;//信号信号量
List <thresd>;线程列表
}
2: dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) => 等待信号。信号量-1
{
S.value = S.value-1;
if S.value<0 then Block(S.list);//阻塞是一个主动行为 当信号量为0的时候主动阻塞
}
3: dispatch_semaphore_signal(semaphore) => 发送一个信号 信号量+1 唤醒
{
S.value = S.value+1;
if S.value<=0 then wakeup(S.list); //唤醒是一个被动行为 当有信号量的时候唤醒线程
}
网友评论