iOS开发中常用的几种锁

7 阅读2分钟

在 iOS 开发中,常用的线程锁(同步机制)主要包括以下几类,它们用于保护共享资源,防止多线程竞争导致的数据不一致问题:

  1. @synchronized
    Objective-C 提供的便捷锁,使用一个对象作为锁标记,会自动创建和释放互斥锁,支持递归调用。
  2. NSLock
    Foundation 框架中的互斥锁对象,遵循 NSLocking 协议,提供 lock 和 unlock 方法,不支持递归。
  3. NSRecursiveLock
    递归锁,允许同一线程多次加锁而不会死锁,适用于递归函数或同一线程多次获取锁的场景。
  4. NSConditionLock
    条件锁,可以设置特定的条件值,只有条件满足时才能获取锁,常用于生产者-消费者模式。
  5. NSCondition
    条件变量,结合互斥锁使用,提供 waitsignalbroadcast 等方法,用于线程间的条件等待和唤醒。
  6. dispatch_semaphore_t
    基于 Grand Central Dispatch 的信号量,通过 wait 和 signal 控制资源访问,可以控制并发线程数。
  7. os_unfair_lock
    iOS 10+ 提供的低开销互斥锁,替代已弃用的 OSSpinLock,避免优先级反转,适用于轻量级锁定。
  8. pthread_mutex_t
    POSIX 标准的互斥锁,可配置为普通锁、递归锁、检错锁等,性能高且跨平台。
  9. pthread_rwlock_t
    读写锁,允许多个线程同时读,写操作独占,适用于读多写少的场景。
  10. OSSpinLock(已弃用)
    自旋锁,忙等待方式,不再推荐使用,因为在高优先级线程锁定、低优先级线程解锁时可能造成优先级反转。

此外,还有一些基于队列的同步方式,虽不是传统意义上的“锁”,但常用于线程同步,例如:

  • 串行队列(dispatch_queue_create 创建串行队列,用同步任务实现互斥)
  • 栅栏函数(dispatch_barrier_async 实现读写锁效果)
  • NSOperationQueue 设置最大并发数为 1 来模拟串行执行。

这些机制根据具体需求选择合适的锁,平衡性能与代码复杂度。