7. property - atomic / nonatomic
atomic 修饰的对象,系统会保证在其自动生成的 getter/setter 方法中的操作是完整的,不受其他线程的影响。例如 A 线程在执行 getter 方法时,B线程执行了 setter 方法,此时 A 线程依然会得到一个完整无损的对象。
atomic
默认修饰符 会保证CPU能在别的线程访问这个属性之前先执行完当前操作 读写速度慢 线程不安全 - 如果有另一个线程 D 同时在调[name release],那可能就会crash,因为 release 不受 getter/setter 操作的限制。也就是说,这个属性只能说是读/写安全的,但并不是线程安全的,因为别的线程还能进行读写之外的其他操作。线程安全需要开发者自己来保证。
nonatomic
不默认 速度更快 线程不安全 如果两个线程同时访问会出现不可预料的结果。
8. Once 原子操作
8.1 GCD
- (id)lock15 {
static id shareInstance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!shareInstance) {
shareInstance = [[NSObject alloc] init];
}
});
return shareInstance;
}
复制代码
8.2 pthread
- (void)lock16 {
pthread_once_t once = PTHREAD_ONCE_INIT;
pthread_once(&once, lock16Func);
}
void lock16Func() {
static id shareInstance;
shareInstance = [[NSObject alloc] init];
}
复制代码 |