解决资源抢夺问题(买车票)

//异步

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

相关文章
相关标签/搜索