博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objetive-C 属性和线程安全
阅读量:5022 次
发布时间:2019-06-12

本文共 1505 字,大约阅读时间需要 5 分钟。

 

 

 

一、接上一篇《nonatomic 带来的线程安全问题》,这里继续详细讨论属性各种类型与线程安全的关系

  1)影响线程安全的属性类型,nonatomic,atomic,weak

@property (atomic, strong)   TestObject  *obj;@property (nonatomic, strong)   TestObject  *obj;@property (atomic, weak)   TestObject  *obj;@property (nonatomic, weak)   TestObject  *obj;

  上面有4种属性的定义,在遇到下面的代码的时候

 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{                for (int i = 0; i < 10000; i++) {            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{//                self.obj = [[TestObject alloc] init];            });        }            });

  第1种定义不会crash,这是符合atomic的标准写法,通过setter、和getter访问器访问变量。

  第2种定义会crash,因为nonatomic定义的属性,在setter中也没有加锁,所以多线程访问之下会出现问题。

  第3种和第4种都不会crash,主要原因是,将对象赋值给weak指针的时候,都不会对对象的引用计数进行改变,

    此外weak对象添加weak引用表标记的时候,还会对该对象进行加锁,因此杜绝了多线程问题。但是多线程访问之下,最好还是atomic。

 

  2)如果一个对象是atomic,并且是通过下划线,实例变量访问的时候还是会crash。

    因为所谓atomic是加在getter和setter中的,我们比较一下下面属性的定义翻译成汇编之后的不同

    

@interface ViewController ()@property (atomic, strong)   TestObject*  x;@property (nonatomic, strong)   TestObject*  y;@end

  

  对应汇编:

注意最后调用的存储方法,一个是加锁版本,一个未加锁版本。在getter中,一个是通过方法返回的,一个是通过指针的偏移

 

二、总结

  iOS中的属性和线程安全需要通过下面的方式保证:

  1) 使用atomic定义属性,同时使用getter和setter能够保证这个对象本身的引用计数线程安全问题,也就是避免多线程导致的错误释放。

  2) 使用weak定义属性,避免多线程中对引用计数的操作。

  保证了属性的原子性性访问,并不代表业务上面的线程安全问题,业务上的线程安全问题。

  业务的线程安全:

  1)加锁,NSLock,递归所,自旋锁,读写锁,内存屏障

  2)串行队列保证任务不会交替执行

  3)使用单线程+异步的模型

 

转载于:https://www.cnblogs.com/doudouyoutang/p/9429415.html

你可能感兴趣的文章
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>
Java操作Excel和Word
查看>>
Oracle 体系结构之ORACLE物理结构
查看>>
ORA-12538: TNS: no such protocol adapter
查看>>
盒子模型
查看>>
局域网协议
查看>>
[HNOI2012]永无乡 线段树合并
查看>>
Spring整合hibernate:3、使用XML进行声明式的事务管理
查看>>
SqlServer之Convert 函数应用格式化日期(转)
查看>>
软件测试领域中的10个生存和发展技巧
查看>>
Camera前后摄像头同时预览
查看>>
HDU 1856
查看>>
课堂作业01--架构师的职责
查看>>