OBObjective-c 多線程(鎖機制) 解決資源搶奪問題

//異步

//  ViewController.masync

//  解決資源搶奪問題atom

//spa

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

//  Copyright © 2015 DC017. All rights reserved.線程

//3d


#import "ViewController.h"orm


@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

相關文章
相關標籤/搜索