单例两种写法
+(instancetype)defaultTools{
static id instance = nil;
static dispatch_once_t onceToken; // onceToken==0
dispatch_once(&onceToken, ^{
instance = [[self alloc]init];
});
// onceToken==-1;
return instance;
}
+(instancetype)defaultTools{
static id instances = nil;
@synchronized (self) { //互斥锁,保证线程读写分离
if (instances == nil) {
instances = [[self alloc]init];
}
}
return instances;
}
两者效率:1>2
原因:第一种:dispatch_once 是线程安全的,只需要每次对onceToken进行判断,最开始onceToken为0,一旦初始化复制完成后onceToken==-1。判断几乎不耗时
第二种:互斥锁等待需要耗时,且耗时时长大于第一种判断的耗时
综合单例还是使用第一种!










网友评论