一、@synchronized
参数是标志符,就像是令牌。持有令牌的方法才能进入。
补充:
1.async异步 sync同步
2.GCD中有两个队列,MainDispatchQueue和GlobalDispatchQueue。
MainDispatchQueue:会将任务插入主线程的RunLoop中执行,串行队列
dispatch_queue_t queue = dispatch_get_main_queue();
GlobalDispatchQueue:全局的并行队列,有4个等级的优先级
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
第一个参数就是优先级
使用:
NSObject *obj = [[NSObject alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@synchronized(obj) {
NSLog(@"需要线程同步的操作1 开始");
sleep(3);
NSLog(@"需要线程同步的操作1 结束");
}
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
sleep(1);
@synchronized(obj) {
NSLog(@"需要线程同步的操作2");
}
});
二、pthread_mutex
使用
__block pthread_mutex_t theLock;
pthread_mutex_init(&theLock, NULL);//第一个参数为锁变量,第二个是锁的属性,NULL为默认。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
pthread_mutex_lock(&theLock);//加锁
NSLog(@"1 开始");
sleep(3);
NSLog(@"1 结束");
sleep(3);
pthread_mutex_unlock(&theLock);//解锁,如果不解, pthread_mutex_lock(&theLock) 后面的语句就不会执行
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
pthread_mutex_lock(&theLock);
NSLog(@"下一步");
pthread_mutex_unlock(&theLock);
});