模拟dispatch_once
2016-05-30 09:20
375 查看
dispatch_once
dispatch_once可以保证一段代码只被执行一次,因此出现之后使用最多的场景就是实现单例。本文来模拟实现dispatch_once的功能。模拟dispatch_once
直接上代码staticNSMutableDictionary *lockMapping=nil; voiddo_once(int*predicate,void(^block)()){ if(*predicate!=-1){ NSLock*lock=nil; @synchronized([NSObjectclass]){ NSLog(@"getlock"); if(lockMapping==nil){ lockMapping=[NSMutableDictionarydictionary]; } NSString*key=[NSStringstringWithFormat:@"%p",predicate]; if(![lockMappingobjectForKey:key]){ [lockMappingsetObject:[[NSLockalloc]init]forKey:key]; } lock=[lockMappingobjectForKey:key]; } [locklock]; if(*predicate!=-1){ block(); *predicate=-1; } [lockunlock]; } } 原理很简单,就不做过多解释了。使用: @interfaceTest:NSObject (instancetype)shareInstance; @end @implementationTest (instancetype)shareInstance{ staticinttoken; staticTest*t=nil; do_once(&token,^{ t=[[Testalloc]init]; NSLog(@"executeonce"); }); NSLog(@"executeeverytime"); returnt; }@end
测试:
intmain() {for(inti=0;i<100;i++){ dispatch_async(dispatch_queue_create(0,DISPATCH_QUEUE_CONCURRENT),^{ [TestshareInstance]; }); } [[NSRunLoopcurrentRunLoop]runUntilDate:[NSDatedistantFuture]]; return0; }
相关文章推荐
- smarty中改进truncate使其支持中文的方法
- MySQL数据库事务隔离级别(Transaction Isolation Level)
- 怎么判断百度网盘分享连接已经失效?有那么简单吗?
- 全排列递归实现
- html实现滚动效果
- HDU 1240 Asteroids!(BFS)
- C#学习笔记之多态之接口
- 飛飛(四十九)用友元函数来编写运算符重载
- 百度地图申请Key jar包和.so文件导入AS中
- 这个是我今天自己写的对缓冲区的个人理解
- Xcode常见报错及解决办法
- 第一天:Java web 的第一个例子 HelloWeb
- 基于BIO的Java Socket通信
- Linux命令学习总结(一)
- LeetCode 049 Group Anagrams
- JSP使用过滤器防止SQL注入
- nyoj 1242 Interference Signal 第八届河南省程序设计大赛
- 浅析——SCTP协议(转)
- 利用Spark解析Tomcat日志,并将统计结果存入Mysql数据库
- 非农户口迁回原籍所需要的材料