iOS都有哪些锁

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

iOS常用的十个锁示例

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。