多线程在应用中频繁应用,多线程应用的也比较多。但是对多线程理解应用有误的话有可能造成死锁等问题。一下是自己在使用过程中一些理解,有出入失误地方,希望大神不惜赐教。
如果同一个时间点,多个线程同时操作(添加和读取)一个数组,如果不适用多线程则就会发生操性错误。下面是一个简单的使用
#import <Foundation/Foundation.h>
@interface DataManager : NSObject
+ (instancetype)shareInstance;
@property (nonatomic, strong) NSArray *data;
- (void)addData:(id)data;
@end
#import "DataManager.h"
@interface DataManager ()
@property (strong, nonatomic) NSMutableArray *dataArray;
@property (strong, nonatomic) dispatch_queue_t concurrentDataQueue;
@end
@implementation DataManager
+ (instancetype)shareInstance {
static DataManager *dataManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dataManager = [[DataManager alloc] init];
dataManager.concurrentDataQueue = dispatch_queue_create("com.kingiol.gcd.dataManagerQueue", DISPATCH_QUEUE_CONCURRENT);
});
return dataManager;
}
- (NSArray *)data {
__block NSArray *returnData = nil;
dispatch_sync(self.concurrentDataQueue, ^{
returnData = [_dataArray copy];
});
return returnData;
}
- (void)addData:(id)data {
if (data) {
dispatch_barrier_async(self.concurrentDataQueue, ^{
if (_dataArray == nil) {
_dataArray = [NSMutableArray array];
}
@synchronized (self) {
[_dataArray addObject:data];
NSLog(@"---- %@",_dataArray);
}
});
}
}
@end
对DataManager的使用(分为多线程调用,循环多线程调用)
多线程调用
- (void) {
dispatch_queue_t queue = dispatch_queue_create("async", DISPATCH_QUEUE_CONCURRENT);// 创建一个并行队列
// 创建两个线程 同时往数组里面添加数据
DataManager *manger = [DataManager shareInstance];
dispatch_async(queue, ^{
[manger addData:@"111"];
});
dispatch_async(queue, ^{
[manger addData:@"222"];
});
dispatch_async(queue, ^{
sleep(1);
[manger addData:@"333"];
});
dispatch_async(queue, ^{
NSLog(@"=====%@", [manger data]);
});
}
循环多线程调用
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
DataManager *manger = [DataManager shareInstance];
dispatch_apply(1000, queue, ^(size_t i) {
dispatch_async(queue, ^{
NSString *num = [NSString stringWithFormat:@"111-%zu",i];
[manger addData:num];
});
});
dispatch_async(queue, ^{
sleep(4);
NSLog(@"=====%@", [manger data]);
});
以上就是多个线程操作同一个资源
- 如果当前有3张图片,我们需要从网络上下载,下载完成之后统一提醒用户下载完成
- (void)GCDgROUP {
// 如果当前有3张图片,我们需要从网络上下载,下载完成之后统一提醒用户下载完成
dispatch_group_t downloaGroup = dispatch_group_create();
for (int i = 0; i< 3; i ++) {
dispatch_group_enter(downloaGroup);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 下载图片程序
NSLog(@"下载完成-- %d", i);
// 在图片下载完成的block中调用
dispatch_group_leave(downloaGroup);
});
}
// 在主程序中提醒用户
dispatch_group_notify(downloaGroup, dispatch_get_main_queue(), ^{
// 提醒用户下载完成
NSLog(@"下载完成");
});
}