iOS 锁相关

241 阅读1分钟

死锁

使用 sync 向当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)

OSSpinLock (自旋锁)

High-level lock

自旋锁不再安全 等待锁的线程会处于忙等状态,一直占用着CPU的资源

可能会出现优先级反转的问题

os_unfair_lock

从底层调用来看,等待 os_unfair_lock 锁的线程处于休眠状态,并非忙等

pthread_mutex (互斥锁)

需要销毁

互斥锁 normal
递归锁

条件锁
pthread_cond_t

pthread_cond_wait

pthread_cond_signal

NSLock

对 pthread_mutex 默认封装

NSRecursiveLock

NSCondition

对 NSConditionLock 和 NSCondition的封装

wait

signal

SerialQueue

gcd 串行队列

Semphore

@synthronized

互斥递归锁

@synthronized(obj)  obj 传递进去 syncData(hashmap)一个 obj 对应一把锁 (pmutext_lock) 
obj对应的递归锁,然后进行加锁、解锁操作

进入SyncData的定义,是一个结构体,主要用来表示一个线程data,类似于链表结构,有next指向,且封装了recursive_mutex_t属性,可以确认@synchronized确实是一个递归互斥锁

自旋锁和互斥锁区别

自旋锁 (不休眠)
预计线程等待锁的时间很短
CPU资源不紧张

互斥锁
预计等待锁的时间较长
有IO操作
CPU资源紧张

读写安全

atomic 读写加锁 但是 release 不加锁

多读单写

pthread_rwlock : 读写锁

等待的锁 会进入休眠

dispatch_barrier_async:异步栅栏函数

queue 必须是自己手动创建的并发队列