在多线程中,atomic只保证getter、setter方法安全,并不保证其它操作,例如字符串拼接,数组移除元素等
-(void)setMstrOrigin:(NSString *)mstrOrigin{
@synchronized(self){
if(_mstrOrigin != mstrOrigin){
[_mstrOrigin release];
_mstrOrigin = [mstrOrigin retain];
}
}
}
-(NSString *)mstrOrigin{
@synchronized(self){
return _mstrOrigin;
}
}
atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,保证用户拿到一个完整的值,也就是保证数据的完整性,并不能保证整个对象是线程安全的。若要对象线程安全,还需要为对象线程加锁。
atomic:线程安全,需要消耗大量的资源
nonatomic:非线程安全,适合内存小的移动设备
synchronized 与 atomic
互斥锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程的任务执行完毕,下一个线程会自动唤醒然后执行任务。
自旋锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。
自旋锁应用场景:
比较适合做一些不耗时的操作
synchronized:互斥锁
atomic:自旋锁
共同点:都能保证同一时刻只能有一个线程操作锁住的代码