iOS都有哪些锁

2020-10-17  本文已影响0人  Li_Po

例如创建单例使用 + (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];
});

例如:
@property (atomic,strong)NSMutableArray * array;
[NSMutableArray array] 安全的,
[array addObject:]是不安全

SpinLook_t是“忙等”的锁。
循环等待访问(whele),不释放当前资源,用于轻量级数据访问
例如: int类型的引用计数加1减1操作

[NSLock lock] [NSLock unlock] 重入会死锁 可以使用递归锁解决

*NSRecursiveLock 递归锁

[NSRecursiveLock lock] [NSRecursiveLock unlock]

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); //唤醒是一个被动行为 当有信号量的时候唤醒线程
}

iOS常用的十个锁示例

https://www.jianshu.com/p/33b608903488

上一篇 下一篇

猜你喜欢

热点阅读