最近买了一个单车锁,敲着敲着代码,突然灵光一闪!! 想起了 iOS中的锁机制!! (天呐。。什么鬼🥱)
平常在项目中用得最多的是信号量锁,其次是关键字锁@synchronized,但小弟不才,在Swift中还没搞清楚synchronized该怎么使用,因为它的效率最低,所以暂时忽略它呗😁
今天就来试验一下传说中最简单的对象锁NSLock。
1. 互斥锁
NSLock、NSRecursiveLock、pthread_mutex 都是属于互斥锁, 还有@synchronized也是互斥锁的一种
2. NSLock的死锁现象
NSLock的 lock() 与 unlock() 必须是成双成对的,有加锁便需要有解锁。
若连续使用 lock() 便出现死锁现象。
(1)在Main线程死锁的话,程序直接卡死。

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

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

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

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

接下来会继续试验其他锁,虽然用得的确比较少😂
小弟不才,若有错误之处,欢迎留言讨论(^_^)
网友评论