证明atomic非线程安全

2018-12-14  本文已影响0人  一丝无尘
#import "ViewController.h"

@interface ViewController ()

@property (atomic, copy) NSMutableArray *testArray;

@end

@implementation ViewController {
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.testArray = [NSMutableArray array];
    //创建自定义并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.gcdTest.queue", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0 ; i < 1000; i ++) {
        dispatch_async(queue, ^{
            [self.testArray addObject:@"1"];
        });
        dispatch_async(queue, ^{
            NSLog(@"--------%@--------", self.testArray);
        });
        dispatch_async(queue, ^{
            [self.testArray addObject:@"1"];
        });
    }
}

这是程序就会闪退

#import "ViewController.h"

@interface ViewController ()

@property (atomic, copy) NSMutableArray *testArray;

@end

@implementation ViewController {
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.testArray = [NSMutableArray array];
    //创建自定义并行队列
    dispatch_queue_t queue = dispatch_queue_create("com.gcdTest.queue", DISPATCH_QUEUE_CONCURRENT);
    for (int i = 0 ; i < 1000; i ++) {
        dispatch_async(queue, ^{
            self.testArray = [@[@"1", @"2"] mutableCopy];
        });
        dispatch_async(queue, ^{
            NSLog(@"--------%@--------", self.testArray);
        });
        dispatch_async(queue, ^{
            self.testArray = [@[@"2"] mutableCopy];
        });
    }
}

这样只是操作了testArray 的set getter 方法,就不会闪退,atomic本身只是在set和getter时加了一把锁

上一篇 下一篇

猜你喜欢

热点阅读