首页 > 编程语言 > 详细

nonatomic 带来的线程安全问题

时间:2020-11-05 17:48:29      阅读:30      评论:0      收藏:0      [点我收藏+]

一、结论

一个对象对外暴露的读写属性,如果这个属性在多个线程中访问,可能会出现crash。因此对外暴露的属性一定要考虑线程安全问题。

二、看下面的代码

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong)   NSObject  *obj;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    for (int i = 0; i < 2; i++) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            self.obj = [[NSObject alloc] init];
        });
    }
}

分析:

obj的set方法,系统默认会先释放掉旧的_obj,然后新的obj才会retain,一个线程给obj设置了值,如果后面有两个线程又同时给obj设置值时,就会同时把obj给release释放两次。过渡释放造成崩溃

obj是atomic时,不会崩溃,里面加了自旋锁。同步锁,set,get方法只能串行执行。

三、现象

产生的现象是一个线程访问这个对象的时候,这个对象已经释放,可能是错误的内存、野指针等情况。

nonatomic 带来的线程安全问题

原文:https://www.cnblogs.com/huangzs/p/13932928.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!