锁 - 主要作用是保证多线程访问资源安全
锁的种类:基本的锁就包括了三类 自旋锁 互斥锁 读写锁
其他的比如条件锁,递归锁,信号量都是上层的封装和实现
读写锁
写者是排他性的,一个读写锁同时只能有一个写者或多个读者(与CPU数相关),但不能同时
既有读者又有写者。在读写锁保持期间也是抢占失效的
读模式锁定时可以共享, 以写模式锁住时意味着独占, 所以读写锁又叫共享-独占锁
互斥锁 :
用于保证在任何时刻,都只能有一个线程访问该对象。 当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒
互斥锁,分为递归锁和非递归锁。
@synchronized (object)
有2个函数
A:objc_sync_enter
B:objc_sync_exit
若object == nil
@synchronized does noting
若object != nil
- 递归锁 可以锁的重入
在执行任务是 objc == nil 的时候 不会造成死锁
1.存储节点
2.哈希结构 - sync_list 表结构 1个个节点为 syncdate(data)
3.递归锁
总结:对互斥锁的一种形式的封装
递归封装,里面是哈希表进行存储 --- 性能比较差
好处是 只对object 锁1次,下次要锁的时候先查询有没有锁着有的话就不进行加锁了.
NSLock
不能递归的互斥锁的封装
不能重入
NSRecursiveLock
递归锁
可以重入
普通线程 - 安全 - NSLock
递归调用 NSRecursiveLock
递归调用外面 还有循环的创建线程的,会照成死锁
条件锁 NSCondition - 信号
生成者消费者模式
保证线程安全
lock锁住
unlock 解锁
保证消费等待生成
wait 等待
signal 生成一个
NSConditionLock
改变信号量
网友评论