自旋锁
不一样于互斥锁
若是访问的资源被占用,它会处于 忙等
状态。自旋锁因为一直处于忙等状态因此他在线程锁被释放的时候会当即获取而不用唤醒,因此其执行效率是很高的,尤为是在多核的cpu上运行效率很高,可是其忙等的状态会消耗cpu
的性能,因此其性能比互斥锁要低不少。atomic
的底层实现,老版本是自旋锁
,新版本是互斥锁
。atomic
并非绝对线程安全,它能保证代码进入 getter
和 setter
方法的时候是安全的,可是并不能保证多线程的访问状况下是安全的,一旦出了 getter
和 setter
方法,其线程安全就要由程序员本身来把握,因此 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); } }); }
咱们的 number
是 atomic
进行加锁了啊,为何还会出现线程安全问题。其实答案上文已经有了,只是须要咱们仔细去品,atomic
只是针对 setter
和 getter
方法进行加锁,上述代码有两个异步线程同时执行,若是某个时间 A线程
执行到getter
方法,以后 cpu
当即切换到 线程B
去执行他的get方法那么这个时候他们进行 +1
的处理并执行setter
方法,那么两个线程的 number
就会是同样的结果,这样咱们的 +1
就会出现线程安全问题,就会致使咱们的数字出现误差程序员
连接安全