25.dispatch_once单例实现原理

前言

日常使用单例的时候会这样用,但是你有考虑过内部具体是怎么实现的么?本文将带你通过源码探究 dispatch_once 的实现原理。

+ (instancetype)shared {
    static RYModel *object;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        object = [[RYModel alloc] init];
    });
    return object;
}

一、 dispatch_once 源码解析

01

入参:

  • dispatch_once_t

    • 一个静态标记

  • dispatch_block_t

    • 执行的 block

1.1 dispatch_once_f

  • static dispatch_once_t onceToken 进行类型转换

  • 通过 onceToken 判断是否第一次执行

_dispatch_once_gate_tryenter

这里尝试进入,原子性的操作,线程安全。锁在当前的线程空间。

1.2 _dispatch_once_callout

第一次执行的相关操作

1.3 _dispatch_once_gate_broadcast

_dispatch_once_mark_done 改变标识

2

回头看一下 dispatch_once_f 执行过就会被直接 return 了。

3

参考

GCD源码:libdispatch

Last updated

Was this helpful?