单例-dispatch_once和@synchronized

单例-dispatch_once和@synchronized

 

一,@synchronized方式

+ (id)sharedInstance

{

static Instance *obj = nil;

@synchronized([Instance class])

{

if(!obj)

obj = [[Instance alloc] init];

}

return obj;

}

@synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改。这个是objective-c的一个锁定令牌,防止self对象在同一时间内被其它线程访问,起到线程的保护作用。

性能就不是很好,因为每次调用+ (id)sharedInstance函数都会付出取锁的代价。下面我们使用更加简洁的方式来实现:

 

二,GCD的方法

+ (id)sharedInstance

{

static dispatch_once_t pred;

static Instance *obj = nil;

dispatch_once(&pred, ^{

obj = [[Instance alloc] init];

});

return obj;

}

优势:

首先满足了线程安全问题,其次很好满足静态分析器要求。GCD可以确保以更快的方式完成这些检测,它可以保证block中的代码在任何线程通过dispatch_once调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。

因此,以后我们使用单例模式的时候尽量使用GCD。

posted @ 2015-09-14 17:00  lynn.liu  阅读(210)  评论(0编辑  收藏  举报