-
@property
属性修饰符中有atomic
和nonatomic
- nonatomic : 非原子属性 适合内存小的移动设备
-
atomic : 原子属性(默认) 需要消耗大量的资源
线程安全,针对多线程设计,默认值
保证同一时间内只有一个线程能够写入(但是同一个时间多个线程都可以读取)atomic
本身就有一把自旋锁
自旋锁: 单写多读-->单个线程写入,多个线程读取
虽然自旋锁可以保护公共资源不被多条线程下同时写入,但允许多条线程下同时读取,并不能解决公共资源数据混乱的问题
-iOS
开发的建议:
所有属性都声明为nonatomic
尽量避免多线程抢夺同一块资源
尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端压力
- 模拟原子属性的实现:
#import "ViewController.h"
@interface ViewController ()
@property (atomic,copy) NSString *name;
@end
@implementation ViewController
// 如果即重写setter方法又重写setter方法,系统就不再为我们生成带下划线的成员变量
@synthesize name = _name;
- (void)viewDidLoad {
[super viewDidLoad];
}
// 模拟原子属性
// 写
- (void)setName:(NSString *)name{
// 通过互斥锁,实现同一时间只有一个线程可以操作
@synchronized (self) {
_name = name;
}
}
// 读
- (NSString *)name{
return _name;
}
@end