iOS的锁机制?都有哪些锁?
相同点:
都能保证同一时间只有一个线程访问共享资源。都能保证线程安全。
不同点:
互斥锁:如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒。
自旋锁:如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
自旋锁的效率高于互斥
互斥锁:
NSLock
自旋锁:
os_unfair_lock_t
信号量
let semaphore = DispatchSemaphore(value: 1)
semaohore.wait() 信号量减1
semaphore.signal() 信号量加1
当信号量的值为0的时候 当前线程会一直阻塞
自旋锁:
GCD和NSOpertion的区别?
CGD是基于C的api ,NSoperation是基于GCD的封装,是面向对象的,相比GCD,NSOperation,更好的处理队列之间的依赖关系,缺点是比GCD稍慢
GCD更好处理任务,NSOperation更好的处理队列。
- NSOpertion 是面向对象,可以封装和继承
- operation方便异步建立依赖,
- 方便最大的并发数量
- 符合kvo的属性
- operation可以暂定 恢复 取消等操作
- 缺点是比CGD稍慢
- Thread(最轻,灵活度高)
- Cocoa Operation (队列+操作对象)
- Grand Central Dispatch(调度队列+操作对象)