線程 例子


#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
相關文章
相關標籤/搜索