dispatch_once认识分析

dispatch_once认识分析

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

dispatch_once为了确保代码运行一次

+(NSDateFormatter*)getDBDateFormat
{
    static NSDateFormatter* format;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        format = [[LKDateFormatter alloc]init];
        format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    });
    return format;
}

dispatch_once_t的描写叙述是typedef long dispatch_once_t;
Description A predicate for use with the dispatch_once function.

dispatch_once展开是

void
_dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
{
    if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
        dispatch_once(predicate, block);
    }
}

~0l 是 long 的0 取反也就是 一大堆1

我们再展开DISPATCH_EXPECT, 是__builtin_expect((x), (v))

__builtin_expect是GCC(version>=2.9)引进的宏,其作用就是帮助编译器推断条件跳转的预期值,避免跳转造成时间乱费。并没有改变其对真值的推断。

所以呢dispatch_once能够看成

+(NSDateFormatter*)getDBDateFormat
{
    static NSDateFormatter* format;
    static long onceToken = 0;
    if (onceToken != 0){
        1...
        {
            format = [[LKDateFormatter alloc]init];
            format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
        }
        2...
    }
    return format;
}

我们能够推測在以下的2…里的代码是改动了 onceToken的值
输出查看一下,

+(NSDateFormatter *) dateFormatter{
    static NSDateFormatter* format;
    static dispatch_once_t onceToken;
    NSLogD(@"%ld", onceToken);
    dispatch_once(&onceToken, ^{
        NSLogD(@"%ld", onceToken);
        format = [[NSDateFormatter alloc] init];
        format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    });
    NSLogD(@"%ld", onceToken);
    return format;
}

结果是
0,
-1073755728,
-1

发如今1里改变了一次
然后在2里改成了-1
因此,我们可以理解dispatch_once的逻辑

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117441.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python基础一 day17 复习

    python基础一 day17 复习

    2021年7月9日
    89
  • 两类数学归纳法及斐波那契通项的证明

    两类数学归纳法及斐波那契通项的证明本文来源于博客园 转载请注明出处以前上学的时候没有学好数学归纳法 最近又学习了一下 其实数学归纳法有好几种 这里介绍的是第一类数学归纳法和第二类数学归纳法第一类数学归纳法百度上是这么解释的 第一数学归纳法可以概括为以下三步 1 证明 n 1 时命题成立 2 假设 n k 时命题成立 3 由归纳假设推出 n k 1 时命题也成立高中的时候不是很理解这其中的道理 通常证明第 1 点很容易

    2025年11月14日
    4
  • 【转载】读懂IL代码就这么简单(二)

    【转载】读懂IL代码就这么简单(二)

    2021年11月20日
    52
  • tomcat日志详解[通俗易懂]

    tomcat日志详解[通俗易懂]文章目录tomcat日志配置tomcat日志文件详解catalina.outcatalina.YYYY-MM-DD.loglocalhost.YYYY-MM-DD.loglocalhost_access_log.YYYY-MM-DD.txthost-manager.YYYY-MM-DD.logmanager.YYYY-MM-DD.log访问日志详细配置tomcat日志文件切割tomcat日志配…

    2022年6月20日
    42
  • redis过期key的删除策略[通俗易懂]

    前言在使用redis的过程中,不免会产生过期的key,而这些key过期后并不会实时地马上被删除,当这些key数量累积越来越多,就会占用很多内存,因此在redis底层同时使用了三种策略来删除这些key。第一种策略:被动删除当读/写一个key时,redis首先会检查这个key是否存在,如果存在且已过期,则直接删除这个key并返回nil给客户端。第二种策略:定期删除redis中有一系列的定期任务(serverCron),这些任务每隔一段时间就会运行一次,其中就包含清理过期key的任务,运行频率由配置文件

    2022年4月8日
    67
  • Redis过期键的删除策略[通俗易懂]

    文章目录立即删除惰性删除定时删除Redis使用的策略Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间。作为一个缓存数据库,这是非常实用的。如我们一般项目中的token或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。我们setkey的时候,都可以给一个expir…

    2022年4月10日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号