代码示例
+ (instancetype)sharedGuide {
static LPGuide *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[LPGuide alloc]init];
});
return instance;
}
使用dispatch_once
可以简化代码并且彻底保证线程安全。无需担心加锁或同步,所有问题
GCD底层处理,变量定义在 static 作用域中,保证编译器执行方法都会复用这个变量,而不会重新创建。
此外,dispatch_once
更高效,没有使用重量级的同步机制,采用“原子访问”来查询标记,判断代码原来是否执行过。重量级的同步机制:每次运行代码都获取锁。
总结:
1.使用 GCD 提供的dispatch_once
编写一次性代码。
2.标记声明在static
和global
作用域中,只需执行一次的块传给dispatch_once
函数,传进去的标记也是相同的。
网友评论