博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
刀哥多线程之一次性代码gcd-11-once
阅读量:4625 次
发布时间:2019-06-09

本文共 1566 字,大约阅读时间需要 5 分钟。

一次性执行

有的时候,在程序开发中,有些代码只想从程序启动就只执行一次,典型的应用场景就是“单例”

// MARK: 一次性执行- (void)once {    static dispatch_once_t onceToken;    NSLog(@"%ld", onceToken);    dispatch_once(&onceToken, ^{        [NSThread sleepForTimeInterval:1.0];        NSLog(@"一次性吗?");    });    NSLog(@"come here");}
  • dispatch 内部也有一把锁,是能够保证”线程安全”的!而且是苹果公司推荐使用的
  • 以下代码用于测试多线程的一次性执行
- (void)demoOnce {    for (int i = 0; i < 10; ++i) {        dispatch_async(dispatch_get_global_queue(0, 0), ^{            [self once];        });    }}

单例测试

单例的特点

  1. 在内存中只有一个实例
  2. 提供一个全局的访问点

单例实现

// 使用 dispatch_once 实现单例+ (instancetype)sharedSingleton {    static id instance;    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        instance = [[self alloc] init];    });    return instance;}// 使用互斥锁实现单例+ (instancetype)sharedSync {    static id syncInstance;    @synchronized(self) {        if (syncInstance == nil) {            syncInstance = [[self alloc] init];        }    }    return syncInstance;}

面试时只要实现上面 sharedSingleton 方法即可

单例测试

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    long largeNumber = 1000 * 1000;    // 测试互斥锁    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();    for (long i = 0; i < largeNumber; ++i) {        [Singleton sharedSync];    }    NSLog(@"互斥锁: %f", CFAbsoluteTimeGetCurrent() - start);    // 测试 dispatch_once    start = CFAbsoluteTimeGetCurrent();    for (long i = 0; i < largeNumber; ++i) {        [Singleton sharedSingleton];    }    NSLog(@"dispatch_once: %f", CFAbsoluteTimeGetCurrent() - start);}

转载于:https://www.cnblogs.com/jiahao89/p/5118281.html

你可能感兴趣的文章
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
iOS常用第三方库 -转
查看>>
Android布局学习
查看>>
python的沙盒环境--virtualenv
查看>>
软件自动化测试——入门、进阶与实战
查看>>
BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
查看>>
BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
查看>>
2016.10.24 继续学习
查看>>
产品功能对标 - 服务授权管理
查看>>
各地IT薪资待遇讨论
查看>>
splay入门
查看>>
带CookieContainer进行post
查看>>
C语言学习笔记--字符串
查看>>
关于七牛进行图片添加文字水印操作小计
查看>>
DataSource数据库的使用
查看>>
Luogu4069 SDOI2016 游戏 树链剖分、李超线段树
查看>>
Java的内部类真的那么难以理解?
查看>>
一文搞懂Java环境,轻松实现Hello World!
查看>>
hash实现锚点平滑滚动定位
查看>>
也谈智能手机游戏开发中的分辨率自适应问题
查看>>