#import "ViewController.h"@interface ViewController (){ NSLock *_lock; //nonatomic属性读取的是内容数据(寄存器计算好的结果) //atomic属性保证直接读取寄存器的数据,****[这样就不会出现一个线程正在修改数据,而另一个线程读取了修改之前的数据]***永远保证同时只有一个线程在访问一个属性// NSMutableArray *_tickets;}@property(atomic,strong)NSMutableArray *tickets;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; _lock = [[NSLock alloc]init]; _tickets = [NSMutableArray array]; [_tickets addObjectsFromArray:@[@"1.上铺",@"1.中铺",@"1.下铺"]]; [self beginSell];}-(void)buyTicket:(int)buyer{ NSLog(@"%i",buyer);//10位顾客准备购买 //使用时,把需要加锁的代码放在lock和unlock之间 //当一个线程A进入加锁代码后,另一个线程B他就无法访问,只有当线程A执行完加锁的任务以后,B线程才能访问加锁代码 //方法1// [_lock lock];//上锁 //方法2 @synchronized(self) { if(_tickets.count > 0){ NSLog(@"%i号顾客买到:%@",buyer,[_tickets lastObject]); [_tickets removeLastObject]; }else{ NSLog(@"%i号顾客晚到了,没有买到",buyer); } }// [_lock unlock];//解锁}#pragma mark 开始贩卖-(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