美文网首页
@synchronized笔记

@synchronized笔记

作者: xgou | 来源:发表于2016-08-15 17:02 被阅读32次

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

相关文章

网友评论

      本文标题:@synchronized笔记

      本文链接:https://www.haomeiwen.com/subject/ykbusttx.html