最近在查询 NSMutableArray线程安全的资料,记录下。
多线程去写NSMutableArray,可采用 NSLock 方式,简单来说就是操作前 lock 操作执行完 unlock。但注意,每个读写的地方都要保证用同一个 NSLock进行操作。另一种方式是利用 GCD 的 concurrent queue 来实现,个人感觉更高效。
1.先创建一个dispatch_queue_t concurrent_queue = dispatch_queue_create("com.domain.queuename", DISPATCH_QUEUE_CONCURRENT)
2.读取操作,虽然是并行队列,但读取操作并不会123dispatch_async(concurrent_queue, ^{ obj = [self.searchResult objectAtIndex:index];});
3.对于写入操作,并行队列中我们利用dispatch_barrier_async
函数来隔离写入操作。12345- (void)insertObject:(id)obj atIndex:(NSUInteger)index { dispatch_barrier_async(concurrent_queue, ^{ [self.searchResult insertObject:obj atIndex:index]; });}
如此变保证了线程安全。你也可以自己写一个 ThreadSafeMutableArray 类,只是注意下类簇的如何子类即可。