OBObjective-c 多线程(锁机制) 解决资源抢夺问题
OBObjective-c 多线程(锁机制) 解决资源抢夺问题
_pioneer_ 发表于2年前
OBObjective-c 多线程(锁机制) 解决资源抢夺问题
  • 发表于 2年前
  • 阅读 26
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

//

//  ViewController.m

//  解决资源抢夺问题

//

//  Created by DC017 on 15/12/25.

//  Copyright © 2015 DC017. All rights reserved.

//


#import "ViewController.h"


@interface ViewController ()

//nonatomic 属性读取的是内存数据(寄存器计算好的结果)

//atomic 属性保证直接读取寄存器的数据,*****[这样就不会出现一个线程正在修改数据,而另一个线程读取了修改之前的属性]*****永远保证同时只有一个线程在访问一个属性


{

    NSLock * lock;

}

@property(atomic,strong)NSMutableArray * muarray;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    _muarray=[[NSMutableArray alloc]init];

    [_muarray addObjectsFromArray:@[@"1.",@"2.",@"3."]];

    [self beginSell];

    

    lock=[[NSLock alloc]init];

    

   

    

    

}

#pragma mark 锁机制

//IOS 中常用两种方法

//1.NSLock

//2.@synchronized

-(void)buyTicket:(int)buyer{

    //1.NSLock

//    [lock lock];

    //使用时,把需要枷锁的代码放在Locckunlock之间

    //当一个线程A进入枷锁代码后,另一个线程B他就无法访问,只能当线程A执行完成任务以后,才能访问

    

    //2.@synchronized

    @synchronized(self) {

        if (_muarray.count>0) {

            NSLog(@"%d号顾客买到了票:%@",buyer,[_muarray lastObject]);

            [_muarray 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


共有 人打赏支持
粉丝 3
博文 81
码字总数 45307
×
_pioneer_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: