- 使用互斥锁(NSLock)
- 原理:互斥锁用于保证在同一时间只有一个线程能够访问被保护的代码块,从而避免数据竞争。
- 代码示例:
NSMutableArray *mutableArray = [NSMutableArray array];
NSLock *lock = [[NSLock alloc] init];
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue1, ^{
[lock lock];
[mutableArray addObject:@"Object from queue1"];
[lock unlock];
});
dispatch_async(queue2, ^{
[lock lock];
[mutableArray addObject:@"Object from queue2"];
[lock unlock];
});
- 使用@synchronized关键字
- 原理:
@synchronized
块会自动创建一个互斥锁,确保在同一时间只有一个线程能够进入该块,从而保证线程安全。
- 代码示例:
NSMutableArray *mutableArray = [NSMutableArray array];
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue1, ^{
@synchronized(mutableArray) {
[mutableArray addObject:@"Object from queue1"];
}
});
dispatch_async(queue2, ^{
@synchronized(mutableArray) {
[mutableArray addObject:@"Object from queue2"];
}
});
- 使用GCD的串行队列
- 原理:将对可变对象的操作放在一个串行队列中执行,由于串行队列一次只能执行一个任务,所以能保证数据的一致性。
- 代码示例:
NSMutableArray *mutableArray = [NSMutableArray array];
dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_queue_t queue1 = dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue2 = dispatch_queue_create("queue2", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue1, ^{
dispatch_async(serialQueue, ^{
[mutableArray addObject:@"Object from queue1"];
});
});
dispatch_async(queue2, ^{
dispatch_async(serialQueue, ^{
[mutableArray addObject:@"Object from queue2"];
});
});