IOS---原子属性atomic和非原子属性nonatomic

一:原子属性和非原子属性

1. OC在定义属性时有nonatomic和atomic两种选择,默认为atomic属性

atomic:原子属性,为setter方法加自旋锁(即为单写多读)

nonatomic:非原子属性,不会为setter方法加锁。

 

2. nonatomic和atomic的对比

atomic:线程安全,需要消耗大量的资源;

nonatomic:非线程安全,适合内存小的移动设备。

 

3. iOS开发的建议

如非需抢占资源的属性(如购票,充值),所有属性都声明为nonatomic。

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

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

 

二:自旋锁和互斥锁

相同点:

同一时间,只有一个线程访问

不同点:

互斥锁:

1、读写方法都是线程安全的

2、如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其它线程时间片到打开锁后,线程会被唤醒(执行)。

自旋锁:

1、单写多读,即写入是线程安全的,但是读取是非线程安全的

2、如果发现有其它线程正在锁定代码,线程会用死循环的方式,一直等待锁定的代码执行完成,自旋锁更适合执行不耗时的代码。

 

三、atomic加锁原理

//atomic 原子性,内部有一把锁,锁的是赋值的setter方法,读取操作没有上锁

//nonatomic 非原子属性,getter、setter方法都不加锁,多个线程都可以访问

//自旋锁

@property(atomic,strong) NSObject *obj2;

//模拟原子属性

- (void)setObj2:(NSObject *)obj2{

    //加锁

    @synchronized(self) {

        _obj2 = obj2;

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值