iOS笔记系列目录
自旋锁
不同于互斥锁
如果访问的资源被占用,它会处于忙等
状态。自旋锁由于一直处于忙等状态所以他在线程锁被释放的时候会立即获取而不用唤醒,所以其执行效率是很高的,尤其是在多核的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
就会出现线程安全问题,就会导致我们的数字出现偏差
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。