美文网首页
atomic是绝对安全的么?

atomic是绝对安全的么?

作者: Amor瑾年v | 来源:发表于2021-01-14 14:06 被阅读0次

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

只是对set方法加锁,而我们程序里面的self.intA = self.intA + 1; 这一部分不是线程安全的,后面这个+1操作不是线程安全的,所以要想最终得到2000的结果,需要使用锁对self.intA = self.intA + 1加锁,代码如下,这里可以将atomic修饰词改为nonatomic,最终修改的代码以及打印结果如下

@property (nonatomic, assign) NSInteger intA;
- (void)viewDidLoad {
    [super viewDidLoad];
    self.lock = [[NSLock alloc] init];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i = 0;i < 1000;i ++){
            [self.lock lock];
            self.intA = self.intA + 1;
            [self.lock unlock];
        }
        NSLog(@"intA : %ld",(long)self.intA);
    });
 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (int i = 0;i < 1000;i ++){
            [self.lock lock];
            self.intA = self.intA + 1;
            [self.lock unlock];
        }
        NSLog(@"intA : %ld",(long)self.intA);
    });
 }
 
 
打印结果
2018-09-12 09:06:57.071829+0800 Test[2200:97290] intA : 1360
2018-09-12 09:06:57.071966+0800 Test[2200:97293] intA : 2000

相关文章

  • atomic是绝对安全的么?

    atomic只能保证属性的存取是线程安全的,并不能保证整个对象是线程安全的。首先看一下代码以及打印结果: 错误的分...

  • atomic是绝对的线程安全么?安全,绝对安全。

    网上看过很多文章都说是不安全的,其实说的并不准确,好多文章都是定位在了atomic修饰的对象是否安全。然后一棒子否...

  • 为什么说atomic是不安全的?

    atomic是否是安全的? 首先要明确的是, 实际上atomic是安全的, 而且是绝对安全的 atomic实际上就...

  • iOS 多线程(3)-atomic和读取安全

    1.atomic 首先要明确的是, 实际上atomic是安全的, 而且是绝对安全的.atomic实际上就是原子操作...

  • 问题:使用atomic一定是线程安全的吗?

    atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。 ...

  • 面试与问题记录 3

    一 .nonatomic 与atomic 区别,atomic是绝对线程安全吗 ?常用的锁有那些? 答: nonat...

  • atomic与线程安全

    本篇文章采用的源码是objc4-781版本 使用atomic一定是线程安全的吗? atomic不是绝对的线程安全。...

  • 4-6 ARC以及修饰符

    修饰符 atomic 是绝对的线程安全吗? retain实现原理 release实现原理 dealloc 实现原理...

  • 原子属性

    1.原子属性是线程安全的atomic,但并不是绝对的安全 原子属性只是保护的set和get方法,比如array,他...

  • atomic非绝对线程安全

    nonatomic 非原子性,可以同时执行setter和getter atomic 原子性,保证setter和ge...

网友评论

      本文标题:atomic是绝对安全的么?

      本文链接:https://www.haomeiwen.com/subject/zulvaktx.html