1、@synchronized简介
@synchronized是对mutex递归锁的封装,可以通过 objc源码 中的objc-sync.mm查看:
int objc_sync_enter(id obj)
{
......
SyncData* data = id2data(obj, ACQUIRE);
data->mutex.lock();
......
}
加锁时会调用objc_sync_enter方法,取出保存的data,调用mutex的加锁方法,data是通过obj作为key保存在内部的哈希表中。
解锁时会调用objc_sync_exit方法:
int objc_sync_exit(id obj)
{
......
data->mutex.tryUnlock();
......
}
2、@synchronized使用
以卖票为例:
- (void)__saleTicket {
@synchronized (self.ticketToken) {// objc_sync_enter
[super __saleTicket];
}// objc_sync_exit
}
传入的token可以是self或者其他任意类型