//異步
// ViewController.masync
// 解決資源搶奪問題(買車票)atom
//spa
// Created by dc008 on 15/12/25..net
// Copyright © 2015年 崔曉宇. All rights reserved.線程
//3d
#import "ViewController.h"orm
@interface 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