NSMutableArray如何保证线程安全

最近在查询 NSMutableArray线程安全的资料,记录下。

相关 Stackoverflow 上的链接

多线程去写NSMutableArray,可采用 NSLock 方式,简单来说就是操作前 lock 操作执行完 unlock。但注意,每个读写的地方都要保证用同一个 NSLock进行操作。另一种方式是利用 GCD 的 concurrent queue 来实现,个人感觉更高效。

1.先创建一个dispatch_queue_t concurrent_queue = dispatch_queue_create("com.domain.queuename", DISPATCH_QUEUE_CONCURRENT)

2.读取操作,虽然是并行队列,但读取操作并不会

1
2
3
dispatch_async(concurrent_queue, ^{
obj = [self.searchResult objectAtIndex:index];
});

3.对于写入操作,并行队列中我们利用dispatch_barrier_async函数来隔离写入操作。

1
2
3
4
5
- (void)insertObject:(id)obj atIndex:(NSUInteger)index {
dispatch_barrier_async(concurrent_queue, ^{
[self.searchResult insertObject:obj atIndex:index];
});
}

如此变保证了线程安全。你也可以自己写一个 ThreadSafeMutableArray 类,只是注意下类簇的如何子类即可。

显示评论