美文网首页
证明atomic非线程安全

证明atomic非线程安全

作者: 一丝无尘 | 来源:发表于2018-12-14 15:57 被阅读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时加了一把锁

    相关文章

      网友评论

          本文标题:证明atomic非线程安全

          本文链接:https://www.haomeiwen.com/subject/wmyghqtx.html