//
// ViewController.m
// 解决资源抢夺问题(买车票)
//
// Created by dc008 on 15/12/25.
// Copyright © 2015年 崔晓宇. All rights reserved.
//
#import "ViewController.h"
ViewController ()
// nonatomic属性读取的是内存数据(寄存器计算好的结果)
// atomic属性读取直接读取寄存器的数据,***[这样就不会出现一个线程正在修改数据,而另一个线程读取了修改之前的数据]*** 永远保证同时只有一个线程在访问一个属性;
{
NSLock *_lock;
}
@property (atomic,strong)NSMutableArray *tickets;//票
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_tickets = [NSMutableArray array];
[_tickets addObjectsFromArray:@[@"1.上铺",@"2.中铺",@"3.下铺"]];
[self beginSell];
_lock = [[NSLock alloc]init];
}
- (void)buyTicket : (int)buyer{
NSLog(@"%d",buyer);//10位顾客准备购买
//使用时,把需要加锁的代码放在lock和unlock之间
//当一个线程A进入加锁代码后,另一个线程B它就无法访问,只有当线程A执行完加锁的任务以后,B线程才能访问加锁代码
// [_lock lock];//上锁
@synchronized(self) {
if (_tickets.count > 0) {
NSLog(@"%d号顾客买到:%@",buyer,[_tickets lastObject]);
[_tickets removeLastObject];
}
else{
NSLog(@"%d号顾客晚了一步!票已经卖完了!!!!",buyer);
}
}
// [_lock unlock];//解锁
}
- (void)beginSell{
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//创建10个线程用于抢票(10个人来买票)
for (int i = 0; i < 10; i++) {
//异步执行
dispatch_async(globalQueue, ^{
[self buyTicket : i];
});
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end