+ (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信号量知识点可以点击蓝色字体前往各大神的详解
网友评论