多线程:原子性与非原子性

//
//  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值