@synchronized笔记

2016-08-15  本文已影响32人  xgou

@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同样的找到后解锁。

上一篇 下一篇

猜你喜欢

热点阅读