死锁
使用 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 必须是自己手动创建的并发队列