//
// ViewController.m
// 07-原子性和非原子性
//
// Created by gzxzmac on 16/1/28.
// Copyright © 2016年 gzxzmac. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSObject *obj1;// 非原子性 非线程安全
/**
原子性
1. 原子性内部也有一把,自旋锁
2. 效率比互斥要高
跟互斥锁区别
1. 互斥锁在等待的时候,会休眠,只要锁一开,马上唤醒,执行代码
2. 自旋锁在等待的时候,一直在判断(死循环) ,只要锁一开,马上执行
*/
// 如果看到博客中还在使用互斥锁,基本是老代码
@property (atomic, strong) NSObject *obj2; // 原子性 线程安全
@property (atomic, strong) NSObject *obj3;// 模拟原子性
// 只要是线程安全的,消耗也会对应增加
@end
// iOS 开发中,所有的属性都应该使用 非原子性 nonatomic
// 所有的 UI 都是 非线程安全的,所以所有的UI操作都要在主线程上执行。
// 如果在子线程执行,有可能程序崩了(机率很大),也有可能不及时刷新
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"start");
// 比较各个属性的效率
/*
测试的时候要用self.成员变量,不要使用 _成员变量
如果你是做深度优化的时候,可以尽量把 self.成员变量改成 _成员变量
*/
NSInteger count = 1000 * 1000;
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; ++i) {
self.obj1 = [[NSObject alloc]init];
}
NSLog(@"非原子性 %f",CFAbsoluteTimeGetCurrent() - start);
start = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; ++i) {
self.obj2 = [[NSObject alloc]init];
}
NSLog(@"原子性 %f",CFAbsoluteTimeGetCurrent() - start);
start = CFAbsoluteTimeGetCurrent();
for (int i = 0; i < count; ++i) {
self.obj3 = [[NSObject alloc]init];
}
NSLog(@"模拟原子性 %f",CFAbsoluteTimeGetCurrent() - start);
}
// 如果是原子性,重写了setter 之后,会要求重写getter 方法
// 如果你重写了setter 和 getter 之后,不再自动生成 _成员变量
// @synthesize 合成指令
@synthesize obj3 = _obj3;
- (void)setObj3:(NSObject *)obj3 {
@synchronized(self) {
_obj3 = obj3;
}
}
- (NSObject *)obj3 {
return _obj3;
}
@end
多线程:原子性与非原子性
最新推荐文章于 2024-08-12 11:23:21 发布