atomic 与 nonatomic 区别
nonatomic:非原子属性,线程不安全的,效率高
atomic:原子属性,线程安全的,效率相对低。
atomic属性内部的锁称为 自旋锁
凡是线程安全的对象,内部肯定会加锁。
1、atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
2、atomic:系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。getter 还是能得到一个完好无损的对象(可以保证数据的完整性),但这个对象在多线程的情况下是不能确定的,也就是说:如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,每次只能有一个线程调用对象的setter方法,所以可以保证数据的完整性。
//虽然atomic是原子性的,但是下面的这种情况是无法保证数据运算完成以后的正确性,
@property(atomic,assign)NSInteger theCount;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
// @synchronized (self) {
for(int i =0; i<1000; i++) {
self.theCount++;
NSLog(@"theCount in threadA is %ld",(long)self.theCount);
}
dispatch_semaphore_signal(self.semaphore);
});
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);
// @synchronized (self) {
for(int i =0; i<1000; i++) {
[self.lock lock];
self.theCount++;
NSLog(@"theCount in threadB is %ld",(long)self.theCount);
}
});
最好的情况是我们在对数据进行运算代码中加锁。
网友评论