IOS单例模式的底层原理

+ (instancetype)shareInstance{

    static Singleton* single;

    static dispatch_once_t onceToken;

    //①onceToken = 0;


    dispatch_once(&onceToken, ^{


        NSLog(@"%ld",onceToken);

        //②onceToken = 140734731430192

        single = [[Singleton alloc] init];

    });


    NSLog(@"%ld",onceToken);

    //③onceToken = -1;

    return single;

}

}

下面我们来看看dispatch_once的原理:

dispatch_once主要是根据onceToken的值来决定怎么去执行代码。

当onceToken= 0时,线程执行dispatch_once的block中代码

当onceToken= -1时,线程跳过dispatch_once的block中代码不执行

当onceToken为其他值时,线程被线程被阻塞,等待onceToken值改变

当线程首先调用shareInstance,某一线程要执行block中的代码时,首先需要改变onceToken的值,再去执行block中的代码。这里onceToken的值变为了140734605830464。

这样当其他线程再获取onceToken的值时,值已经变为140734605830464。其他线程被阻塞。

当block线程执行完block之后。onceToken变为-1。其他线程不再阻塞,跳过block。

下次再调用shareInstance时,block已经为-1。直接跳过block。

这样dispatch_once在首次调用时同步阻塞线程,生成单例之后,不再阻塞线程。dispatch_once是创建单例的最优方案

你可能感兴趣的:(IOS单例模式的底层原理)