1

iOS笔记系列目录

  • 自旋锁 不同于互斥锁 如果访问的资源被占用,它会处于 忙等 状态。自旋锁由于一直处于忙等状态所以他在线程锁被释放的时候会立即获取而不用唤醒,所以其执行效率是很高的,尤其是在多核的cpu上运行效率很高,但是其忙等的状态会消耗cpu的性能,所以其性能比互斥锁要低很多。
  • atomic 的底层实现,老版本是自旋锁,新版本是互斥锁
  • atomic 并不是绝对线程安全,它能保证代码进入 gettersetter 方法的时候是安全的,但是并不能保证多线程的访问情况下是安全的,一旦出了 gettersetter 方法,其线程安全就要由程序员自己来把握,所以 atomic 属性和线程安全并没有必然联系。
@property (atomic, assign) NSInteger number;  
  
- (void)atomicTest {  
    dispatch_async(dispatch_get_global_queue(0, 0), ^{  
        for (int i = 0; i < 10000; i ++) {  
            self.number = self.number + 1;  
            NSLog(@"A-self.number is %ld",self.number);  
        }  
    });  
  
    dispatch_async(dispatch_get_global_queue(0, 0), ^{  
        for (int i = 0; i < 10000; i ++) {  
            self.number = self.number + 1;  
            NSLog(@"B-self.number is %ld",self.number);  
        }  
    });  
}

我们的 numberatomic 进行加锁了啊,为什么还会出现线程安全问题。其实答案上文已经有了,只是需要我们仔细去品,atomic 只是针对 settergetter 方法进行加锁,上述代码有两个异步线程同时执行,如果某个时间 A线程 执行到getter方法,之后 cpu 立即切换到 线程B 去执行他的get方法那么这个时候他们进行 +1 的处理并执行setter方法,那么两个线程的 number 就会是一样的结果,这样我们的 +1就会出现线程安全问题,就会导致我们的数字出现偏差

链接


Adrenine
9 声望3 粉丝

最怕一生碌碌无为却道平凡难能可贵!