iOS经典讲解之线程锁NSLock案例(卖火车票)
2015-09-23 23:11
567 查看
#import "RootViewController.h" @interface RootViewController () // 声明总票数 @property (nonatomic, assign) NSInteger totalTickets; // 声明剩余票数 @property (nonatomic, assign) NSInteger subTickets; // 线程锁 @property (nonatomic, retain) NSLock *lock; @end @implementation RootViewController -(void)dealloc { [_lock release]; [super dealloc]; } - (void)viewDidLoad { [super viewDidLoad]; [self tickets]; } #pragma mark ----------------买火车票线程锁实现----------------------- // 买火车票线程锁实现 - (void)tickets { // 初始化票数 _totalTickets = 100; // 剩余票 _subTickets = 100; // 初始化线程锁 self.lock = [[NSLock alloc] init]; // 先创建出两个并行队列 // 一个队列是火车站 // 一个队列是12306 dispatch_queue_t queue1 = dispatch_queue_create("火车站", DISPATCH_QUEUE_CONCURRENT); // 给火车站添加一个卖票的任务 dispatch_async(queue1, ^{ // 卖票 [self saleTickets:queue1]; }); // 创建12306队列 dispatch_queue_t queue2 = dispatch_queue_create("12306", DISPATCH_QUEUE_CONCURRENT); // 也给12306添加一个卖票任务 dispatch_async(queue2, ^{ // 卖票 [self saleTickets:queue2]; }); } // 卖票方法 - (void)saleTickets:(dispatch_queue_t)queue { // 循环卖票 while (_subTickets > 0) { // 添加锁 // 线程锁和自动释放池 使用方法差不多 中间的部分是锁的内容 [self.lock lock]; // 要知道是哪个队列来卖票 // 通过队列的标示符 得到 //dispatch_queue_get_label(queue)得到队列的标示符 char *name = (char *)dispatch_queue_get_label(queue); NSString *str = [NSString stringWithUTF8String:name]; NSLog(@"%@还剩%ld", str, _subTickets); //来一回减少一张 _subTickets--; //解锁 [self.lock unlock]; } } @end
相关文章推荐
- 【iPhone/iPad】苹果iOS9正式版更新升级及固件刷机教程
- iOS学习 用代码实现界面 控件注解
- iOS 动画之CALayer动画
- ios激情详解之动画3D旋转晃动
- iOS本地化国际化多语言支持
- 【iOS】KVC 和 KVO 的使用场景
- iOS9 News 应用
- iOS 开发中实现打电话功能实用代码
- 《ios应用开发详解》1-3章
- 《ios应用开发详解》目录篇
- ios开发,一些注意项和常见错误
- ios开发记录
- iOS开发:navigationcontrol…
- iOS开发:navigationcontrol…
- iOS开发:使用ToolBar切换视图
- iOS开发:NavigationBar
- iOS大典之点击旋转, 点击停止
- ios激情详解之动画页面翻转
- ios实现点击空白处关闭键盘
- IOS 控件的尺寸放大和缩小