解決資源搶奪問題(買車票)

//異步

//  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;//

@end


@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位顧客準備購買

    //使用時,把須要加鎖的代碼放在lockunlock之間

    //當一個線程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

相關文章
相關標籤/搜索