详解 atomic 与 nonatomic

我们声明属性的时候,必须要考虑到属性特质对编译器所产生的存取方法的影响。


atomic nonatomic:


在默认情况下,由编译器所合成的方法会通过锁定机制确保其原子性(atomicity)。如果属性具备nonatomic特质,则不需要同步锁。


请注意!!!!尽管没有名为atomic的特质(如果某属性不具备nonatomic特质,那它就是原子的”(atomic)),但是仍然可以在属性特质中写明这一点,编译器是不会报错的。


atomicnonatomic的区别


之前说过,具备atomic特质的获取方法会通过锁定机制来确保其操作的原子性。


也就是说,如果两个线程同时读取一个属性,那么不论何时,总能看到有效的属性值。


如果不加锁的话(或者说使用nonatomic语义),那么当其中一个线程正在改写某属性值的时候,另外一个线程也许会突然闯入,把尚未修改好的属性值读取出来。发生这种情况时,线程读取到的属性值可能不对。


一般iOS程序中,所有属性都声明为nonatomic。这样做的原因是:

iOS中使用同步锁的开销比较大, 这会带来性能问题。一般情况下并不要求属性必须是原子的,因为这并不能保证线程安全”(thread safety),若要实现线程安全的操作,还需采用更为深层的锁定机制才可以。


例如:一个线程在连续多次读取某个属性值的过程中有别的线程在同时改写该值,那么即便将属性声明为atomic,也还是会读取到不同的属性值。


因此,iOS程序一般都会使用nonatomic属性。但是在Mac OS X程序时, 使用atomic属性通常都不会有性能瓶颈。


下面总结一下:

原子和非原子属性

 

atomic:原子属性,为setter方法加锁(默认就是atomic);线程安全,需要消耗大量的资源

nonatomic:非原子属性,不会为setter方法加锁;非线程安全,适合内存小的移动设备

 

atomic加锁原理

1 @property (assign, atomic) int age;
2 
3 - (void)setAge:(int)age
4 { 
5 
6     @synchronized(self) { 
7        _age = age;
8     }
9 }


iOS开发的建议:

所有属性都声明为nonatomic。

尽量避免多线程抢夺同一块资源。

尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值