现在的位置: 首页 > 综合 > 正文

atomic修饰的属性一定就是安全的吗?

2019年11月13日 综合 ⁄ 共 863字 ⁄ 字号 评论关闭

  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   最终的结果和我们预期的完全是不一样的,这是为什么呢?

抱歉!评论已关闭.