线程 例子


#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
相关文章
相关标签/搜索