多用派发队列,少用同步锁
来源:互联网 发布:曲面细分算法 编辑:程序博客网 时间:2024/05/15 19:19
在Objective-C中,如果有多个线程要执行同一份代码,那么有时候可能会出现问题,这种情况下,通常使用锁来实现某种同步机制。在GCD出现之前,有两种办法。第一种采用内置的“同步块”(synchronization block):
- (void)synchronizedMethod { @synchronized(self){ // Safe }}
这种写法会根据给定的对象,自动创建一个锁,并等待块中的代码执行完毕。执行到这段代码的结尾处,锁就释放了。but滥用@synchronized(self)则会降低代码效率,因为共用同一个锁的那些同步块,都必须按顺序执行。
另一个办法是直接食用NSLock对象:
_lock = [[NSLock alloc] init];-(void)synchronizedMethod { [_lock lock]; // Safe [_lock unlock];}
GCD以更简单、更高效的形式为代码加锁。 使用“串行同步队列”。将读取操作以及写入操作都安排在同一个队列里,即可保证数据同步。
_syncQueue = dispatch_queue_create("com.effectiveobjectivec.syncQueue",NULL);- (NSString *)someString { __block NSString *localSomething; dispatch_sync(_syncQueue, ^{ localSomeString = _someString; }); return localSomeString;}- (void)setSomeString:(NSString *)someString { dispatch_sync(_syncQueue, ^{ _someString = someString; });}
多个获取方法可以并发执行,而获取方法与设置方法之间不能并发执行,利用这个特点,可以优化代码。改为并发队列。
_syncQueue = dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);-(NSString *)someString { __block NSString *localSomeString; dispatch_sync (_syncQueue, ^{ localSomeString = _someString; }); return localSomeString;}- (void)setSomeString:(NSString *)someString { dispatch_barrier_async(_syncQueue, ^{ _someString = someString; });}
栏栅块必须单独执行,不能与其他块并行,这只对并发队列有意义,因为串行队列中的块总是按顺序逐个来执行的。并发队列如果发现接下来要处理的块是个栏栅块,那么就一直等到当前所有并发块都执行完毕,才会单独执行这个栏栅块。待栏栅块执行过后,再按正常方式继续向下处理。
设置方法中使用了栏栅块之后,对属性的读取操作依然可以并发执行,但是写入操作却必须单独执行了。
0 0
- 多用派发队列,少用同步锁
- 第41条:多用派发队列,少用同步锁
- 写高质量OC代码52建议总结:41.多用派发列队,少用同步锁
- 多用GCD,少用PerformSelector
- 多用GCD,少用performSelector
- 多用GCD,少用performSelector
- 多用组合,少用继承
- 存储过程是多用还是少用?
- 存储过程是多用还是少用?
- 为什么说多用组合,少用继承?
- Git多用Fetch少用Pull
- 为什么说多用组合,少用继承?
- 多用块枚举,少用for循环
- 多用块枚举,少用for循环
- 为什么要多用组合少用继承?
- 浩易南:少用信用卡,少逛淘宝,多用现金
- 读effective objective-c 2.0 整理文章 - 41条 多用派发队列,少用锁
- Linux下编程为什么多用进程少用线程?
- xListview
- Nyist 915 +-字符串
- Git常用命令
- hdu4355 三分
- Extended OLEDB library : Ease of ADO, power of OLEDB
- 多用派发队列,少用同步锁
- 华为OJ 初级:计算字符串的相似度
- Redis 数据类型
- Session 和 Cokkie的区别和lianx
- NKOI 1852 追查坏奶牛
- iOS 两个应用之间的交互
- javacv 条形码识别
- 让JS的Alert消息提示框失效禁止弹出网页警告框
- [正则表达式]-基础语法三 其他特殊字符与转义字符