在 iOS 开发中,常用的线程锁(同步机制)主要包括以下几类,它们用于保护共享资源,防止多线程竞争导致的数据不一致问题:
@synchronized
Objective-C 提供的便捷锁,使用一个对象作为锁标记,会自动创建和释放互斥锁,支持递归调用。NSLock
Foundation 框架中的互斥锁对象,遵循NSLocking协议,提供lock和unlock方法,不支持递归。NSRecursiveLock
递归锁,允许同一线程多次加锁而不会死锁,适用于递归函数或同一线程多次获取锁的场景。NSConditionLock
条件锁,可以设置特定的条件值,只有条件满足时才能获取锁,常用于生产者-消费者模式。NSCondition
条件变量,结合互斥锁使用,提供wait、signal、broadcast等方法,用于线程间的条件等待和唤醒。dispatch_semaphore_t
基于 Grand Central Dispatch 的信号量,通过wait和signal控制资源访问,可以控制并发线程数。os_unfair_lock
iOS 10+ 提供的低开销互斥锁,替代已弃用的OSSpinLock,避免优先级反转,适用于轻量级锁定。pthread_mutex_t
POSIX 标准的互斥锁,可配置为普通锁、递归锁、检错锁等,性能高且跨平台。pthread_rwlock_t
读写锁,允许多个线程同时读,写操作独占,适用于读多写少的场景。OSSpinLock(已弃用)
自旋锁,忙等待方式,不再推荐使用,因为在高优先级线程锁定、低优先级线程解锁时可能造成优先级反转。
此外,还有一些基于队列的同步方式,虽不是传统意义上的“锁”,但常用于线程同步,例如:
- 串行队列(
dispatch_queue_create创建串行队列,用同步任务实现互斥) - 栅栏函数(
dispatch_barrier_async实现读写锁效果) NSOperationQueue设置最大并发数为 1 来模拟串行执行。
这些机制根据具体需求选择合适的锁,平衡性能与代码复杂度。