iOS开发 - NSLock与线程

最近买了一个单车锁,敲着敲着代码,突然灵光一闪!! 想起了 iOS中的锁机制!! (天呐。。什么鬼)

平常在项目中用得最多的是信号量锁,其次是关键字锁@synchronized,但小弟不才,在Swift中还没搞清楚synchronized该怎么使用,因为它的效率最低,所以暂时忽略它呗
今天就来试验一下传说中最简单的对象锁NSLock。

1. 互斥锁
NSLock、NSRecursiveLock、pthread_mutex 都是属于互斥锁, 还有@synchronized也是互斥锁的一种

2. NSLock的死锁现象
NSLock的 lock() 与 unlock() 必须是成双成对的,有加锁便需要有解锁。 
若连续使用 lock() 便出现死锁现象。
(1)在Main线程死锁的话,程序直接卡死。

iOS开发 - NSLock与线程_第1张图片
(1)主线程中死锁

(2) 若在子线程中死锁,并不会影响主线程

iOS开发 - NSLock与线程_第2张图片
(2)子线程中死锁


(3) 同样在主线程中,使用try() 方法,可以有效避免死锁。
该方法会返回一个bool值,表示当前锁是否可用状态

iOS开发 - NSLock与线程_第3张图片
(3)使用tryLock


3. NSLock与线程
锁只保证资源不被同时执行,但执行顺序是依靠线程控制。

iOS开发 - NSLock与线程_第4张图片
线程控制执行顺序

当线程优先级同等时,执行顺序是不可控的

iOS开发 - NSLock与线程_第5张图片
异步+同等优先级


接下来会继续试验其他锁,虽然用得的确比较少

小弟不才,若有错误之处,欢迎留言讨论(^_^)

你可能感兴趣的:(iOS开发 - NSLock与线程)