单例的理解

+ (instancetype)sharedInstance
{
    // 静态指针
    static FUParameters * single = nil;
    
    // 类似一个线程锁的效果
    static dispatch_once_t token;
    // 保证block内部的代码在整个应用程序当中只会执行一次
    dispatch_once(&token,^{
        single = [FUParameters new];
    });
    
    return single;
}

static保证只初始化一次Static关键字理解

dispatch_once函数内部使用了信号量保证了线程安全问题。在dispatch_once_t前使用static关键字,保证了dispatch_once_t只执行一次,默认dispatch_once_t的值为0,dispatch_once在执行时会监测dispatch_once_t的值是否为大于等于0,如果为0就继续往下执行并将值减1改为-1,如果小于0就不继续执行(信号量原理)。这就保证了单例在全局中只执行一次。

信号量是一个非负整数,定义了两种原子操作:wait跟signal来进行访,信号量主要用于线程同步。当一个线程调用wait操作时,如果信号量的值大于0,则获得资源并将信号量值减一,如果等于0线程睡眠直到信号量值大于0或者超时;singal将信号量的值加1,如果这时候有正在等待的线程,唤醒该线程。

细说@synchronized和dispatch_once
GCD信号量-dispatch_semaphore_t

本文涉及到的static,dispatch_once,GCD信号量知识点可以点击蓝色字体前往各大神的详解

你可能感兴趣的:(单例的理解)