- #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)得到队列的标示符
- charchar *name = (charchar *)dispatch_queue_get_label(queue);
- NSString *str = [NSString stringWithUTF8String:name];
- NSLog(@"%@还剩%ld", str, _subTickets);
- //来一回减少一张
- _subTickets--;
- //解锁
- [self.lock unlock];
- }
- }
- @end
iOS线程锁NSLock案例(卖火车票)
最新推荐文章于 2023-01-11 14:00:00 发布