【iOS笔记 #4】Atomic & 自旋锁

  • 自旋锁 不一样于互斥锁 若是访问的资源被占用,它会处于 忙等 状态。自旋锁因为一直处于忙等状态因此他在线程锁被释放的时候会当即获取而不用唤醒,因此其执行效率是很高的,尤为是在多核的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就会出现线程安全问题,就会致使咱们的数字出现误差程序员

连接安全