atomic 修饰的属性是绝对安全的吗?为什么?
不一定安全,所谓的安全只是局限于 Setter、Getter 的访问器方法而言的,你对它做 Release 的操作是不会受影响的。这个时候就容易崩溃了。
atomic原子性,是否是绝对线程安全的,不是绝对线程安全怎么理解?首先看一下代码以及打印结果
@property (atomic, assign) NSInteger intA; //有一个atomic的属性,表示是原子的
- (void)viewDidLoad {
[super viewDidLoad];
//开启一个线程对intA的值+1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0;i < 1000;i ++){ self.intA = self.intA + 1; } NSLog(@"intA : %ld",(long)self.intA); }); //开启一个线程对intA的值+1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ for (int i = 0;i < 1000;i ++){ self.intA = self.intA + 1; } NSLog(@"intA : %ld",(long)self.intA); }); } 错误的分析是:因为intA是atomic修饰的,所以是线程安全的,在+1的时候,只会有一个线程去操作,所以最终的打印结果必定有一个是2000。 看一下打印结果 2018-09-12 08:47:20.019123+0800 Test[1019:48584] intA : 1186 2018-09-12 08:47:20.019123+0800 Test[1019:48583] intA : 896 最终的结果和我们预期的完全是不一样的,这是为什么呢?