@synchronized作用就是相当于一个加锁解锁的操作。
例如
@synchronized (obj) {
[obj run];
}
等价于
[lock lock];
[obj run];
[lock unlock];
但这个@synchronized (obj)里的obj是干什么的呢,摩擦了半天找到一个说法就是这个obj,就是这个锁上下文关联用的。
意思是只有当是同一个obj的时候,这个锁才会关联并互斥。否则,就没有互斥的作用,代码示例
//主线程中
TestObj *obj = [[TestObj alloc] init];
//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
@synchronized(obj){
[obj method1];
sleep(10);
}
});
//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
sleep(1);
@synchronized(obj){
[obj method2];
}
});
等价于
TestObj *obj = [[TestObj alloc] init];
__block pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
//线程1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
pthread_mutex_lock(&mutex);
[obj method1];
sleep(5);
pthread_mutex_unlock(&mutex);
});
//线程2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{
sleep(1);
pthread_mutex_lock(&mutex);
[obj method2];
pthread_mutex_unlock(&mutex);
});
每调用下@sychronized,Objective-C runtime 都会为其分配一个递归锁并存储在哈希表中。分成2个动作:
@try {
objc_sync_enter(obj);
} @finally {
objc_sync_exit(obj);
}
并生成一个结构体
typedef struct SyncData {
id obj;
recursive_mutex_tmutex;
structSyncData* nextData;
intthreadCount;
} SyncData;
存于内存中的哈希表里
typedef struct SyncList {
SyncData *data;
spinlock_tlock;
} SyncList;
objc_sync_enter这个操作就是到哈希表里找到这个对象的锁的地址,并加锁,objc_sync_exit同样的找到后解锁。