#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
iOS经典讲解之线程锁NSLock案例(卖火车票)
最新推荐文章于 2023-04-11 14:18:07 发布