1、@synchronized简介

@synchronized是对mutex递归锁的封装,可以通过 objc源码 中的objc-sync.mm查看:

  1. int objc_sync_enter(id obj)
  2. {
  3. ......
  4. SyncData* data = id2data(obj, ACQUIRE);
  5. data->mutex.lock();
  6. ......
  7. }

加锁时会调用objc_sync_enter方法,取出保存的data,调用mutex的加锁方法,data是通过obj作为key保存在内部的哈希表中。
解锁时会调用objc_sync_exit方法:

  1. int objc_sync_exit(id obj)
  2. {
  3. ......
  4. data->mutex.tryUnlock();
  5. ......
  6. }

2、@synchronized使用

以卖票为例:

  1. - (void)__saleTicket {
  2. @synchronized (self.ticketToken) {// objc_sync_enter
  3. [super __saleTicket];
  4. }// objc_sync_exit
  5. }

传入的token可以是self或者其他任意类型