> 锁是什么
* 锁是一种同步机制,用于存在多线程环境中实施对资源的访问限制.可以理解成用于排出并发的一种策略.
锁的分类
* 一般都是建议锁,就是每个任务去访问资源的时候,都要取得锁的信息,再根据所得信息来确定是否可以存取.
锁的作用
* 多线程的时候保证资源的同步机制
自旋锁/互斥锁
* 自旋锁会一直占用CPU,直到锁打开,互斥锁不会,他会在线程锁住后CPU还可以进行其他事务.
实际应用
* @synchronized互斥锁[‘sɪŋkrənaɪzd]念g音
1.加锁代码少
2.添加的OC对象必须在多个线程中的同一对象
3.不需要显式的创建锁对象
4.性能差—-因为里面会加入异常处理,所以耗时
5.它会隐式的添加异常处理来保护代码,改程序在抛出异常的时候回自动释放—不安全,程序异常,加这个锁意义就不大了
* NSLock互斥锁
1.不能多次调用lock方法,会造成死锁
2.tryLock试图获取一个锁,但是如果锁不可用的时候,它不会堵塞,返回NO
3.lockBeforeDate方法试图获取一个锁,但是如果锁没有在规定时间内获取,他会让线程从堵塞状态编程非堵塞状态.
* NSRecursiveLock递归锁[rɪ'kɝsɪv]
1.和NSLock有区别的地方就是NSRecursiveLock可以多次lock.
2.每次成功lock都必须平衡调用unlock,只有所有锁住和解锁平衡的时候,锁才真正释放给其他线程获得
* NSConditionLock条件锁
1.需要lock和unlock相对应
2.不过lock,lockWhenCondition:与unlock,unlockWithCondition:是可以随意组合的
3.两个api可以通过字面意思去理解 lockWhencondition:2 当条件为2的时候加锁,unlockwithCondition:2 当条件为2的时候解锁
* NSCondition
1.他的强大之处是在于它可以给每个线程都加锁,但是正是因为这种加锁方式,使它无法真正避免资源竞争.
* pthread_mutex互斥锁
并没有过多的解释,我的理解是好像和synchronized一个用法,不确定
* dispatch_semaphore信号量实现的锁[sɛməfɔr]
1.GCD中提供的信号机制
2.我们可以通过这个信号机制去构建一把”锁”,本质其实是有区别的
解释:
信号量:是用在多线程同步任务的,一个线程完成了一个动作通过信号量告诉别的线程,然后别的线程在进行动作.其他线程没有接到信号,就给我堵在那
互斥锁:是用在多线程任务互斥的,一个线程占用了某个资源,那么别的线程无法访问,直到这个线程unlock其他线程才可以利用这个资源.
信号量不一定是锁定某个资源,而线程互斥量是直接锁定某一资源.
* OSSpinLock