NSMutableArray怎么保證線程安全

多線程去寫NSMutableArray,可采用 NSLock 方式,
簡單來說就是操作前 lock 操作執(zhí)行完 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 來實現(xiàn),個人感覺更高效。

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];
    });
    }

轉(zhuǎn)載:
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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • NSThread 第一種:通過NSThread的對象方法 NSThread *thread = [[NSThrea...
    攻城獅GG閱讀 854評論 0 3
  • 一個類要么是多線程安全的,要么它就不是。 前言 多線程情況下的隨機crash是在iOS 編程過程中比較常見的一種?...
    可樂偶滴最耐閱讀 2,173評論 0 1
  • 對于多線層的安全一直都是面試的重點,面試官一般會問線程安全,你會從那些角度去解決這個問題? 這里我說一下我的拙見,...
    Jeff_Kitty閱讀 484評論 0 0
  • 原文出處:容芳志的博客 簡介 iOS有三種多線程編程的技術(shù),分別是: (一)NSThread(二)Cocoa NS...
    Asserts閱讀 463評論 0 0
  • 凌晨 希望同思念 從潮濕的夢里爬出 昨夜 醉酒人 走投無路 絕望 他至死 也無法忘記 頂著寒風(fēng) 看白云飛走 他日不再輕言
    阿琴姑娘閱讀 917評論 49 76