#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