@synchronized
关于 @synchonized(){} 的使用官方文档解释得非常清楚。可以总结为以下几点:
- 给指令所做的事情与其他互斥锁一样
-
@synchronized(){}
圆括号内的 OC 对象作为 Token 来标识一个锁。如果在不同位置 @synchronized 的圆括号传入相同的 OC 对象,可以认为是同一个锁,否则是不同的锁 - 该指令内部有做异常捕获,在捕获处释放锁,这样做会有额外的性能消耗。如果不需要可以直接使用
NSLock
来替代。
atomic
这是一个属性修饰符,保证多线程环境下,对所修饰的变量的读取是线程安全的,但是会影响存取的效率。
NSLock
简单的互斥锁,不可重入,重入会导致死锁。
OSSpinLock
自旋锁:循环等待访问,不释放当前资源。
应用场景:用于轻量级的数据访问。
自旋锁已经不在安全,可以拜读 ibireme 大神的文章:不再安全的 OSSpinLock.
NSRecursiveLock
递归锁,解决简单互斥锁线程重入导致死锁的问题,可以在循环语句或者递归方法中应用
dispatch_semaphore_t
信号量,可以看本人写的关于 dispatch_semaphore_t 文章
网友评论