iOS系统GCD学习(7):dispatch_once
来源:互联网 发布:苏州c语言培训多少钱 编辑:程序博客网 时间:2024/04/27 16:49
GCD还提供单次初始化支持,这个与pthread中的函数 pthread_once很相似。GCD提供的方式的优点在于它使用block而非函数指针,这就允许更自然的代码方式。
这个特性的主要用途是惰性单例初始化或者其他的线程安全数据共享。典型的单例初始化技术看起来像这样(线程安全的):
01
02
03
04
05
06
07
08
09
10
+ (id)sharedWhatever
{
static
Whatever *whatever = nil;
@synchronized([Whatever
class
])
{
if
(!whatever)
whatever = [[Whatever alloc] init];
}
return
whatever;
}
这挺好的,但是代价比较昂贵;每次调用 +sharedWhatever 函数都会付出取锁的代价,即使这个锁只需要进行一次。确实有更风骚的方式来实现这个,使用类似双向锁或者是原子操作的东西,但是这样挺难弄而且容易出错。创建单例有更加简单的方式,使用GCD,我们可以这样重写上面的方法,使用函数 dispatch_once:
1
2
3
4
5
6
7
8
9
+ (id)sharedWhatever
{
static
dispatch_once_t pred;
static
Whatever *whatever = nil;
dispatch_once(&pred, ^{
whatever = [[Whatever alloc] init];
});
return
whatever;
}
该方法有很多优势:
1 线程安全
2 很好满足静态分析器要求
3 和自动引用计数(ARC)兼容
4 仅需要少量代码
这个稍微比 @synchronized方法简单些,并且GCD确保以更快的方式完成这些检测,它保证block中的代码在任何线程通过 dispatch_once 调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。
- iOS系统GCD学习(7):dispatch_once
- iOS系统GCD学习(7):dispatch_once
- iOS系统GCD学习(7):dispatch_once
- IOS GCD学习之 —— 基本概念 & Dispatch Queue & dispatch_once
- iOS-GCD多线程之dispatch_once
- GCD学习笔记(十):dispatch_once
- iOS GCD系列(一) dispatch_after;dispatch_apply;dispatch_once
- iOS GCD~performSelector、dispatch_once、NSOperation总结
- GCD学习之——dispatch_once
- iOS学习笔记74-完整详解GCD系列(二)dispatch_after;dispatch_apply;dispatch_once
- iOS中使用GCD的dispatch_once创建单例
- iOS系统GCD学习(1):介绍
- iOS系统GCD学习(2):Dispatch Queue
- iOS系统GCD学习(3):dispatch_group
- iOS系统GCD学习(4):dispatch_group2
- iOS系统GCD学习(5):信号量机制
- iOS系统GCD学习(6):Dispatch Sources
- iOS系统GCD学习(5):信号量机制
- python怎么解压缩tar.gz文件
- My End of the World Post
- Oracle账户管理
- STL::list 遍历元素方法
- 读书 《Oracle Wait Interface: A Practical Guide to Performance Diagnostics & Tuning》
- iOS系统GCD学习(7):dispatch_once
- 度量驱动开发
- JavaScript语言分辨浏览器方法
- 数字电视CA原理与破解方式
- 探讨c++函数中的参数传递与返回值(三) 函数返回值
- 对 XML 操作的辅助类
- 压缩文件伪装成图片
- mono for android 样式
- C语言POSIX正则表达式示例