一、原子和非原子属性
1. OC在定义属性时有
nonatomic和atomic两种选择:
atomic:原子属性,为setter方法加锁(默认就是atomic);
nonatomic:非原子属性,不会为setter方法加锁。
2.
nonatomic和atomic的对比
atomic:线程安全,需要消耗大量的资源;
nonatomic:非线程安全,适合内存小的移动设备。
3. iOS开发的建议
所有属性都声明为
nonatomic。
尽量避免多线程抢夺同一块资源。
尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力。
二、互斥锁&自旋锁
互斥锁:
如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其它线程时间片到打开锁后,线程会被唤醒(执行)。
自旋锁:
如果发现有其它线程正在锁定代码,线程会用死循环的方式,一直等待锁定的代码执行完成,自旋锁更适合执行不耗时的代码。
//nonatomic 非原子性,getter setter 方法都不加锁,多个线程都可以访问
//atomic 原子性,内部有一把锁,锁的是赋值的setter方法,读取操作没有上锁
//自旋锁
@property(atomic,strong) NSObject *obj2;
//模拟原子属性
- (void)setObj2:(NSObject *)obj2{
//加锁
@synchronized(self) {
_obj2 = obj2;
}
}