很多人实现单例会这样写:
@implementation XXClass+ (id)sharedInstance { static XXClass *sharedInstance = nil; @synchronized(self) { if (!sharedInstance) { sharedInstance = [[self alloc] init]; } } return sharedInstance; }
相比之下:
@implementation XXClass+ (id)sharedInstance { static XXClass *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (!sharedInstance) { sharedInstance = [[self alloc] init]; } }); return sharedInstance; }
使用dispatch_once可以简化代码并且彻底保证线程安全,开发者无需担心加锁或同步。此外,dispatch_once更高效,它没有使用重量级的同步机制,若是那样做的话,每次运行代码前都要获取锁。相反,此函数采用“原子访问”来查询标记,以判断其所对应的代码原来是否已经执行过。在64位Mac OS X上测试,后者的执行速度要比前者快一倍。