NSMutableArray怎么保证线程安全

多线程去写NSMutableArray,可采用 NSLock 方式,
简单来说就是操作前 lock 操作执行完 unlock。
但注意,每个读写的地方都要保证用同一个 NSLock进行操作。

NSLock *arrayLock = [[NSLock alloc] init];
[...]
[arrayLock lock]; // NSMutableArray isn't thread-safe
[myMutableArray addObject:@"something"];
[myMutableArray removeObjectAtIndex:5];
[arrayLock unlock];

另一种方式是利用 GCD 的 concurrent queue 来实现,个人感觉更高效。

dispatch_queue_t concurrent_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

For read:

  • (id)objectAtIndex:(NSUInteger)index {
    __block id obj;
    dispatch_sync(self.concurrent_queue, ^{
    obj = [self.searchResult objectAtIndex:index];
    });
    return obj;
    }

For insert:

  • (void)insertObject:(id)obj atIndex:(NSUInteger)index {
    dispatch_barrier_async(self.concurrent_queue, ^{
    [self.searchResult insertObject:obj atIndex:index];
    });
    }

For remove:

  • (void)removeObjectAtIndex:(NSUInteger)index {
    dispatch_barrier_async(self.concurrent_queue, ^{
    [self.searchResult removeObjectAtIndex:index];
    });
    }

转载:
https://stackoverflow.com/questions/12098011/is-objective-cs-nsmutablearray-thread-safe/17981941#17981941
https://hepinglaosan.github.io/2017/06/20/Thread-Safe-NSMutableArray/

http://blog.csdn.net/kongdeqin/article/details/53171189

https://juejin.im/entry/595ee8a76fb9a06bb47489ef

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • NSThread 第一种:通过NSThread的对象方法 NSThread *thread = [[NSThrea...
    攻城狮GG阅读 861评论 0 3
  • 一个类要么是多线程安全的,要么它就不是。 前言 多线程情况下的随机crash是在iOS 编程过程中比较常见的一种�...
    可乐偶滴最耐阅读 2,177评论 0 1
  • 对于多线层的安全一直都是面试的重点,面试官一般会问线程安全,你会从那些角度去解决这个问题? 这里我说一下我的拙见,...
    Jeff_Kitty阅读 489评论 0 0
  • 原文出处:容芳志的博客 简介 iOS有三种多线程编程的技术,分别是: (一)NSThread(二)Cocoa NS...
    Asserts阅读 464评论 0 0
  • 凌晨 希望同思念 从潮湿的梦里爬出 昨夜 醉酒人 走投无路 绝望 他至死 也无法忘记 顶着寒风 看白云飞走 他日不再轻言
    阿琴姑娘阅读 922评论 49 76