OC中的锁

> 锁是什么

* 锁是一种同步机制,用于存在多线程环境中实施对资源的访问限制.可以理解成用于排出并发的一种策略.

锁的分类

* 一般都是建议锁,就是每个任务去访问资源的时候,都要取得锁的信息,再根据所得信息来确定是否可以存取.

锁的作用

* 多线程的时候保证资源的同步机制

自旋锁/互斥锁

* 自旋锁会一直占用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

你可能感兴趣的:(OC中的锁)