为什么说NSMutableArray是线程不安全的?

原理

NSMutableArray是线性表中的顺序存储结构,是一块连续的内存,当添加新的元素时,容量已经等于当前的大小的时候(存不下了),会依次执行下面3步:

  • 重新开辟一块大小为当前容量两倍的数组
  • 把原数据拷贝过去
  • 释放掉旧的数组

完事后再把这个元素加在后面。

防范措施(使用信号量)

代码如下:

@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *mArray;
@property (nonatomic, strong) dispatch_semaphore_t semaphore;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
     self.semaphore = dispatch_semaphore_create(1);
    
    dispatch_queue_t queue = dispatch_queue_create("test_queue", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        [self test];
    });
    
    dispatch_async(queue, ^{
        [self test];
    });
}

- (void)test {
    dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
    for (int i = 0; i < 10; i++) {
        [self.mArray addObject:@(i)];
    }
    for (int i = 0; i < self.mArray.count; i++) {
        NSNumber *number = self.mArray[i];
        NSLog(@"currentThread: %@----%@", [NSThread currentThread],number.stringValue);
    }
    dispatch_semaphore_signal(self.semaphore);
}

- (NSMutableArray *)mArray {
    if (!_mArray) {
        @synchronized(self) {
            if (!_mArray) {
               _mArray = @[].mutableCopy;
            }
        }
    }
    return _mArray;
}

@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转自:http://blog.csdn.net/oreo_go/article/details/52116214 ...
    YYT1992阅读 4,886评论 0 4
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,173评论 0 11
  • 在一个方法内部定义的变量都存储在栈中,当这个函数运行结束后,其对应的栈就会被回收,此时,在其方法体中定义的变量将不...
    Y了个J阅读 9,895评论 1 14
  • 从数据的逻辑结构来分,数据元素之间存在的关联关系被称为数据的逻辑结构。归纳起来,应用程序中的数据大致哟如下四种基本...
    Jack921阅读 4,643评论 0 2
  • 已习惯早晨五点起床,收拾完毕小宝就醒了。上午和老妈在家做塔饼(平度叫哈饼),煎的鱼、蘑菇、豆腐、土豆,丰盛的午餐。...
    明懿妈妈阅读 1,220评论 0 1

友情链接更多精彩内容