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 源码解析

入参:
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 改变标识

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

参考
Last updated
Was this helpful?